AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Player Class Reference

#include "Player.h"

Inheritance diagram for Player:
Unit GridObject< Player > WorldObject Object WorldLocation Position

Classes

struct  BgBattlegroundQueueID_Rec
 
struct  ChatFloodThrottle
 

Public Types

typedef std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
 
typedef std::set< uint32DFQuestsDoneList
 
- Public Types inherited from Unit
typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 Player (WorldSession *session)
 
 ~Player () override
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void SetObjectScale (float scale) override
 
bool hasSpanishClient ()
 
bool TeleportTo (uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
 
bool TeleportTo (WorldLocation const &loc, uint32 options=0, Unit *target=nullptr)
 
bool TeleportToEntryPoint ()
 
void SetSummonPoint (uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
 
bool IsSummonAsSpectator () const
 
void SetSummonAsSpectator (bool on)
 
void SummonIfPossible (bool agree, ObjectGuid summoner_guid)
 
time_t GetSummonExpireTimer () const
 
bool Create (ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
 
void Update (uint32 time) override
 
PlayerFlags GetPlayerFlags () const
 
bool HasPlayerFlag (PlayerFlags flags) const
 
void SetPlayerFlag (PlayerFlags flags)
 
void RemovePlayerFlag (PlayerFlags flags)
 
void ReplaceAllPlayerFlags (PlayerFlags flags)
 
bool IsClass (Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
 
void SetInWater (bool apply)
 
bool IsInWater () const override
 
bool IsFalling () const
 
bool IsInAreaTriggerRadius (AreaTrigger const *trigger, float delta=0.f) const
 
void SendInitialPacketsBeforeAddToMap ()
 
void SendInitialPacketsAfterAddToMap ()
 
void SendTransferAborted (uint32 mapid, TransferAbortReason reason, uint8 arg=0)
 
void SendInstanceResetWarning (uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
 
bool CanInteractWithQuestGiver (Object *questGiver)
 
CreatureGetNPCIfCanInteractWith (ObjectGuid guid, uint32 npcflagmask)
 
GameObjectGetGameObjectIfCanInteractWith (ObjectGuid guid, GameobjectTypes type) const
 
void ToggleAFK ()
 
void ToggleDND ()
 
bool isAFK () const
 
bool isDND () const
 
uint8 GetChatTag () const
 
uint32 GetBarberShopCost (uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
 
PlayerSocialGetSocial ()
 
void InitTaxiNodesForLevel ()
 
bool ActivateTaxiPathTo (std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
 
bool ActivateTaxiPathTo (uint32 taxi_path_id, uint32 spellid=1)
 
void CleanupAfterTaxiFlight ()
 
void ContinueTaxiFlight ()
 
void SendTaxiNodeStatusMultiple ()
 
bool IsCommentator () const
 
void SetCommentator (bool on)
 
bool IsDeveloper () const
 
void SetDeveloper (bool on)
 
bool isAcceptWhispers () const
 
void SetAcceptWhispers (bool on)
 
bool IsGameMaster () const
 
void SetGameMaster (bool on)
 
bool isGMChat () const
 
void SetGMChat (bool on)
 
bool isTaxiCheater () const
 
void SetTaxiCheater (bool on)
 
bool isGMVisible () const
 
void SetGMVisible (bool on)
 
bool Has310Flyer (bool checkAllSpells, uint32 excludeSpellId=0)
 
void SetHas310Flyer (bool on)
 
void SetPvPDeath (bool on)
 
void GiveXP (uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
 
void GiveLevel (uint8 level)
 
void InitStatsForLevel (bool reapplyMods=false)
 
bool HasActivePowerType (Powers power) override
 
bool GetCommandStatus (uint32 command) const
 
void SetCommandStatusOn (uint32 command)
 
void SetCommandStatusOff (uint32 command)
 
uint32 GetTotalPlayedTime ()
 
uint32 GetLevelPlayedTime ()
 
void setDeathState (DeathState s, bool despawn=false) override
 
void SetRestState (uint32 triggerId)
 
void RemoveRestState ()
 
uint32 GetXPRestBonus (uint32 xp)
 
float GetRestBonus () const
 
void SetRestBonus (float restBonusNew)
 
bool HasRestFlag (RestFlag restFlag) const
 
void SetRestFlag (RestFlag restFlag, uint32 triggerId=0)
 
void RemoveRestFlag (RestFlag restFlag)
 
uint32 GetInnTriggerId () const
 
PetStableGetPetStable ()
 
PetStableGetOrInitPetStable ()
 
PetStable const * GetPetStable () const
 
PetGetPet () const
 
PetSummonPet (uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0s, uint32 healthPct=0)
 
void RemovePet (Pet *pet, PetSaveMode mode, bool returnreagent=false)
 
bool CanPetResurrect ()
 
bool IsExistPet ()
 
PetCreatePet (Creature *creatureTarget, uint32 spellID=0)
 
PetCreatePet (uint32 creatureEntry, uint32 spellID=0)
 
uint32 GetPhaseMaskForSpawn () const
 
void Say (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles said message in regular chat based on declared language and in config pre-defined Range.
 
void Say (uint32 textId, WorldObject const *target=nullptr) override
 
void Yell (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles yelled message in regular chat based on declared language and in config pre-defined Range.
 
void Yell (uint32 textId, WorldObject const *target=nullptr) override
 
void TextEmote (std::string_view text, WorldObject const *=nullptr, bool=false) override
 Outputs an universal text which is supposed to be an action.
 
void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false) override
 
void Whisper (std::string_view text, Language language, Player *receiver, bool=false) override
 Handles whispers from Addons and players based on sender, receiver's guid and language.
 
void Whisper (uint32 textId, Player *target, bool isBossWhisper=false) override
 
void SetVirtualItemSlot (uint8 i, Item *item)
 
void SetSheath (SheathState sheathed) override
 
uint8 FindEquipSlot (ItemTemplate const *proto, uint32 slot, bool swap) const
 
uint32 GetItemCount (uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
 
uint32 GetItemCountWithLimitCategory (uint32 limitCategory, Item *skipItem=nullptr) const
 
ItemGetItemByGuid (ObjectGuid guid) const
 
ItemGetItemByEntry (uint32 entry) const
 
ItemGetItemByPos (uint16 pos) const
 
ItemGetItemByPos (uint8 bag, uint8 slot) const
 
BagGetBagByPos (uint8 slot) const
 
uint32 GetFreeInventorySpace () const
 
ItemGetUseableItemByPos (uint8 bag, uint8 slot) const
 
ItemGetWeaponForAttack (WeaponAttackType attackType, bool useable=false) const
 
bool HasWeapon (WeaponAttackType type) const override
 
bool HasWeaponForAttack (WeaponAttackType type) const override
 
ItemGetShield (bool useable=false) const
 
std::vector< Item * > & GetItemUpdateQueue ()
 
bool IsValidPos (uint16 pos, bool explicit_pos)
 
bool IsValidPos (uint8 bag, uint8 slot, bool explicit_pos)
 
uint8 GetBankBagSlotCount () const
 
void SetBankBagSlotCount (uint8 count)
 
bool HasItemCount (uint32 item, uint32 count=1, bool inBankAlso=false) const
 
bool HasItemFitToSpellRequirements (SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
 
bool CanNoReagentCast (SpellInfo const *spellInfo) const
 
bool HasItemOrGemWithIdEquipped (uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
 
bool HasItemOrGemWithLimitCategoryEquipped (uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
 
InventoryResult CanTakeMoreSimilarItems (Item *pItem) const
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count) const
 
InventoryResult CanStoreNewItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
 
InventoryResult CanStoreItems (Item **pItem, int32 count) const
 
InventoryResult CanEquipNewItem (uint8 slot, uint16 &dest, uint32 item, bool swap) const
 
InventoryResult CanEquipItem (uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanEquipUniqueItem (Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanEquipUniqueItem (ItemTemplate const *itemProto, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanUnequipItems (uint32 item, uint32 count) const
 
InventoryResult CanUnequipItem (uint16 src, bool swap) const
 
InventoryResult CanBankItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanUseItem (Item *pItem, bool not_loading=true) const
 
bool HasItemTotemCategory (uint32 TotemCategory) const
 
bool IsTotemCategoryCompatiableWith (ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
 
InventoryResult CanUseItem (ItemTemplate const *pItem) const
 
InventoryResult CanUseAmmo (uint32 item) const
 
InventoryResult CanRollForItemInLFG (ItemTemplate const *item, WorldObject const *lootedObject) const
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet &allowedLooters)
 
ItemStoreItem (ItemPosCountVec const &pos, Item *pItem, bool update)
 
ItemEquipNewItem (uint16 pos, uint32 item, bool update)
 
ItemEquipItem (uint16 pos, Item *pItem, bool update)
 
void AutoUnequipOffhandIfNeed (bool force=false)
 
bool StoreNewItemInBestSlots (uint32 item_id, uint32 item_count)
 
void AutoStoreLoot (uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
 
void AutoStoreLoot (uint32 loot_id, LootStore const &store, bool broadcast=false)
 
LootItemStoreLootItem (uint8 lootSlot, Loot *loot, InventoryResult &msg)
 
void UpdateLootAchievements (LootItem *item, Loot *loot)
 
void UpdateTitansGrip ()
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count, Item *pItem, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item *pItem=nullptr, bool swap=false, uint32 *no_space_count=nullptr) const
 
void AddRefundReference (ObjectGuid itemGUID)
 
void DeleteRefundReference (ObjectGuid itemGUID)
 
void ApplyEquipCooldown (Item *pItem)
 
void SetAmmo (uint32 item)
 
void RemoveAmmo ()
 
float GetAmmoDPS () const
 
bool CheckAmmoCompatibility (ItemTemplate const *ammo_proto) const
 
void QuickEquipItem (uint16 pos, Item *pItem)
 
void VisualizeItem (uint8 slot, Item *pItem)
 
void SetVisibleItemSlot (uint8 slot, Item *pItem)
 
ItemBankItem (ItemPosCountVec const &dest, Item *pItem, bool update)
 
ItemBankItem (uint16 pos, Item *pItem, bool update)
 
void RemoveItem (uint8 bag, uint8 slot, bool update, bool swap=false)
 
void MoveItemFromInventory (uint8 bag, uint8 slot, bool update)
 
void MoveItemToInventory (ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
 
void RemoveItemDependentAurasAndCasts (Item *pItem)
 
void DestroyItem (uint8 bag, uint8 slot, bool update)
 
void DestroyItemCount (uint32 item, uint32 count, bool update, bool unequip_check=false)
 
void DestroyItemCount (Item *item, uint32 &count, bool update)
 
void DestroyConjuredItems (bool update)
 
void DestroyZoneLimitedItem (bool update, uint32 new_zone)
 
void SplitItem (uint16 src, uint16 dst, uint32 count)
 
void SwapItem (uint16 src, uint16 dst)
 
void AddItemToBuyBackSlot (Item *pItem, uint32 money)
 
ItemGetItemFromBuyBackSlot (uint32 slot)
 
void RemoveItemFromBuyBackSlot (uint32 slot, bool del)
 
uint32 GetMaxKeyringSize () const
 
void SendEquipError (InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
 
void SendBuyError (BuyResult msg, Creature *creature, uint32 item, uint32 param)
 
void SendSellError (SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
 
void AddWeaponProficiency (uint32 newflag)
 
void AddArmorProficiency (uint32 newflag)
 
uint32 GetWeaponProficiency () const
 
uint32 GetArmorProficiency () const
 
bool IsTwoHandUsed () const
 
void SendNewItem (Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
 
bool BuyItemFromVendorSlot (ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
 
bool _StoreOrEquipNewItem (uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
 
float GetReputationPriceDiscount (Creature const *creature) const
 
float GetReputationPriceDiscount (FactionTemplateEntry const *factionTemplate) const
 
PlayerGetTrader () const
 
TradeDataGetTradeData () const
 
void TradeCancel (bool sendback)
 
CinematicMgrGetCinematicMgr () const
 
void UpdateEnchantTime (uint32 time)
 
void UpdateSoulboundTradeItems ()
 
void AddTradeableItem (Item *item)
 
void RemoveTradeableItem (Item *item)
 
void UpdateItemDuration (uint32 time, bool realtimeonly=false)
 
void AddEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurationsReferences (Item *item)
 
void RemoveArenaEnchantments (EnchantmentSlot slot)
 
void AddEnchantmentDuration (Item *item, EnchantmentSlot slot, uint32 duration)
 
void ApplyEnchantment (Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
 
void ApplyEnchantment (Item *item, bool apply)
 
void UpdateSkillEnchantments (uint16 skill_id, uint16 curr_value, uint16 new_value)
 
void SendEnchantmentDurations ()
 
void UpdateEnchantmentDurations ()
 
void BuildEnchantmentsInfoData (WorldPacket *data)
 
void AddItemDurations (Item *item)
 
void RemoveItemDurations (Item *item)
 
void SendItemDurations ()
 
void LoadCorpse (PreparedQueryResult result)
 
void LoadPet ()
 
bool AddItem (uint32 itemId, uint32 count)
 
void PrepareGossipMenu (WorldObject *source, uint32 menuId=0, bool showQuests=false)
 
void SendPreparedGossip (WorldObject *source)
 
void OnGossipSelect (WorldObject *source, uint32 gossipListId, uint32 menuId)
 
uint32 GetGossipTextId (uint32 menuId, WorldObject *source)
 
uint32 GetGossipTextId (WorldObject *source)
 
void ToggleInstantFlight ()
 
int32 GetQuestLevel (Quest const *quest) const
 
void PrepareQuestMenu (ObjectGuid guid)
 
void SendPreparedQuest (ObjectGuid guid)
 
bool IsActiveQuest (uint32 quest_id) const
 
Quest const * GetNextQuest (ObjectGuid guid, Quest const *quest)
 
bool CanSeeStartQuest (Quest const *quest)
 
bool CanTakeQuest (Quest const *quest, bool msg)
 
bool CanAddQuest (Quest const *quest, bool msg)
 
bool CanCompleteQuest (uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
 
bool CanCompleteRepeatableQuest (Quest const *quest)
 
bool CanRewardQuest (Quest const *quest, bool msg)
 
bool CanRewardQuest (Quest const *quest, uint32 reward, bool msg)
 
void AddQuestAndCheckCompletion (Quest const *quest, Object *questGiver)
 
void AddQuest (Quest const *quest, Object *questGiver)
 
void AbandonQuest (uint32 quest_id)
 
void CompleteQuest (uint32 quest_id)
 
void IncompleteQuest (uint32 quest_id)
 
void RewardQuest (Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
 
void SetRewardedQuest (uint32 quest_id)
 
void FailQuest (uint32 quest_id)
 
bool SatisfyQuestSkill (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLevel (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLog (bool msg)
 
bool SatisfyQuestPreviousQuest (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestClass (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestRace (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestReputation (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestStatus (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestConditions (Quest const *qInfo, bool msg)
 
bool SatisfyQuestTimed (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestExclusiveGroup (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestNextChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestPrevChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestDay (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestWeek (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestMonth (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestSeasonal (Quest const *qInfo, bool msg) const
 
bool GiveQuestSourceItem (Quest const *quest)
 
bool TakeQuestSourceItem (uint32 questId, bool msg)
 
uint32 CalculateQuestRewardXP (Quest const *quest)
 
bool GetQuestRewardStatus (uint32 quest_id) const
 
QuestStatus GetQuestStatus (uint32 quest_id) const
 
void SetQuestStatus (uint32 questId, QuestStatus status, bool update=true)
 
void RemoveActiveQuest (uint32 questId, bool update=true)
 
void RemoveRewardedQuest (uint32 questId, bool update=true)
 
void SendQuestUpdate (uint32 questId)
 
QuestGiverStatus GetQuestDialogStatus (Object *questGiver)
 
float GetQuestRate (bool isDFQuest=false)
 
void SetDailyQuestStatus (uint32 quest_id)
 
bool IsDailyQuestDone (uint32 quest_id)
 
void SetWeeklyQuestStatus (uint32 quest_id)
 
void SetMonthlyQuestStatus (uint32 quest_id)
 
void SetSeasonalQuestStatus (uint32 quest_id)
 
void ResetDailyQuestStatus ()
 
void ResetWeeklyQuestStatus ()
 
void ResetMonthlyQuestStatus ()
 
void ResetSeasonalQuestStatus (uint16 event_id)
 
uint16 FindQuestSlot (uint32 quest_id) const
 
uint32 GetQuestSlotQuestId (uint16 slot) const
 
uint32 GetQuestSlotState (uint16 slot) const
 
uint16 GetQuestSlotCounter (uint16 slot, uint8 counter) const
 
uint32 GetQuestSlotTime (uint16 slot) const
 
void SetQuestSlot (uint16 slot, uint32 quest_id, uint32 timer=0)
 
void SetQuestSlotCounter (uint16 slot, uint8 counter, uint16 count)
 
void SetQuestSlotState (uint16 slot, uint32 state)
 
void RemoveQuestSlotState (uint16 slot, uint32 state)
 
void SetQuestSlotTimer (uint16 slot, uint32 timer)
 
void SwapQuestSlot (uint16 slot1, uint16 slot2)
 
uint16 GetReqKillOrCastCurrentCount (uint32 quest_id, int32 entry)
 
void AreaExploredOrEventHappens (uint32 questId)
 
void GroupEventHappens (uint32 questId, WorldObject const *pEventObject)
 
void ItemAddedQuestCheck (uint32 entry, uint32 count)
 
void ItemRemovedQuestCheck (uint32 entry, uint32 count)
 
void KilledMonster (CreatureTemplate const *cInfo, ObjectGuid guid)
 
void KilledMonsterCredit (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void KilledPlayerCredit (uint16 count=1)
 
void KilledPlayerCreditForQuest (uint16 count, Quest const *quest)
 
void KillCreditGO (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void TalkedToCreature (uint32 entry, ObjectGuid guid)
 
void MoneyChanged (uint32 value)
 
void ReputationChanged (FactionEntry const *factionEntry)
 
void ReputationChanged2 (FactionEntry const *factionEntry)
 
bool HasQuestForItem (uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
 
bool HasQuestForGO (int32 GOId) const
 
bool HasQuest (uint32 questId) const
 
void UpdateForQuestWorldObjects ()
 
bool CanShareQuest (uint32 quest_id) const
 
void SendQuestComplete (uint32 quest_id)
 
void SendQuestReward (Quest const *quest, uint32 XP)
 
void SendQuestFailed (uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
 
void SendQuestTimerFailed (uint32 quest_id)
 
void SendCanTakeQuestResponse (uint32 msg) const
 
void SendQuestConfirmAccept (Quest const *quest, Player *pReceiver)
 
void SendPushToPartyResponse (Player const *player, uint8 msg) const
 
void SendQuestUpdateAddItem (Quest const *quest, uint32 item_idx, uint16 count)
 
void SendQuestUpdateAddCreatureOrGo (Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
 
void SendQuestUpdateAddPlayer (Quest const *quest, uint16 old_count, uint16 add_count)
 
ObjectGuid GetDivider ()
 
void SetDivider (ObjectGuid guid=ObjectGuid::Empty)
 
uint32 GetInGameTime ()
 
void SetInGameTime (uint32 time)
 
void AddTimedQuest (uint32 quest_id)
 
void RemoveTimedQuest (uint32 quest_id)
 
bool HasPvPForcingQuest () const
 
bool LoadFromDB (ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
 
bool isBeingLoaded () const override
 
void Initialize (ObjectGuid::LowType guid)
 
void SaveToDB (bool create, bool logout)
 
void SaveToDB (CharacterDatabaseTransaction trans, bool create, bool logout)
 
void SaveInventoryAndGoldToDB (CharacterDatabaseTransaction trans)
 
void SaveGoldToDB (CharacterDatabaseTransaction trans)
 
void _SaveSkills (CharacterDatabaseTransaction trans)
 
void SetBindPoint (ObjectGuid guid)
 
void SendTalentWipeConfirm (ObjectGuid guid)
 
void ResetPetTalents ()
 
void CalcRage (uint32 damage, bool attacker)
 
void RegenerateAll ()
 
void Regenerate (Powers power)
 
void RegenerateHealth ()
 
void setRegenTimerCount (uint32 time)
 
void setWeaponChangeTimer (uint32 time)
 
uint32 GetMoney () const
 
bool ModifyMoney (int32 amount, bool sendError=true)
 
bool HasEnoughMoney (uint32 amount) const
 
bool HasEnoughMoney (int32 amount) const
 
void SetMoney (uint32 value)
 
RewardedQuestSet const & getRewardedQuests () const
 
QuestStatusMapgetQuestStatusMap ()
 
QuestStatusSaveMapGetQuestStatusSaveMap ()
 
std::size_t GetRewardedQuestCount () const
 
bool IsQuestRewarded (uint32 quest_id) const
 
UnitGetSelectedUnit () const
 
PlayerGetSelectedPlayer () const
 
void SetTarget (ObjectGuid=ObjectGuid::Empty) override
 
void SetSelection (ObjectGuid guid)
 Used for serverside target changes, does not apply to players.
 
void SendMailResult (uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
 
void SendNewMail ()
 
void UpdateNextMailTimeAndUnreads ()
 
void AddNewMailDeliverTime (time_t deliver_time)
 
void RemoveMail (uint32 id)
 
void AddMail (Mail *mail)
 
uint32 GetMailSize ()
 
MailGetMail (uint32 id)
 
PlayerMails const & GetMails () const
 
void SendItemRetrievalMail (uint32 itemEntry, uint32 count)
 
void SendItemRetrievalMail (std::vector< std::pair< uint32, uint32 > > mailItems)
 
ItemGetMItem (ObjectGuid::LowType itemLowGuid)
 
void AddMItem (Item *it)
 
bool RemoveMItem (ObjectGuid::LowType itemLowGuid)
 
void PetSpellInitialize ()
 
void CharmSpellInitialize ()
 
void PossessSpellInitialize ()
 
void VehicleSpellInitialize ()
 
void SendRemoveControlBar ()
 
bool HasSpell (uint32 spell) const override
 
bool HasActiveSpell (uint32 spell) const
 
TrainerSpellState GetTrainerSpellState (TrainerSpell const *trainer_spell) const
 
bool IsSpellFitByClassAndRace (uint32 spell_id) const
 
bool IsNeedCastPassiveSpellAtLearn (SpellInfo const *spellInfo) const
 
void SendProficiency (ItemClass itemClass, uint32 itemSubclassMask)
 
void SendInitialSpells ()
 
void SendLearnPacket (uint32 spellId, bool learn)
 
bool addSpell (uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
 
bool _addSpell (uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
 
void learnSpell (uint32 spellId, bool temporary=false, bool learnFromSkill=false)
 
void removeSpell (uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
 
void resetSpells ()
 
void LearnCustomSpells ()
 
void LearnDefaultSkills ()
 
void LearnDefaultSkill (uint32 skillId, uint16 rank)
 
void learnQuestRewardedSpells ()
 
void learnQuestRewardedSpells (Quest const *quest)
 
void learnSpellHighRank (uint32 spellid)
 
void SetReputation (uint32 factionentry, float value)
 
uint32 GetReputation (uint32 factionentry) const
 
std::string const & GetGuildName ()
 
uint32 GetFreeTalentPoints () const
 
void SetFreeTalentPoints (uint32 points)
 
bool resetTalents (bool noResetCost=false)
 
uint32 resetTalentsCost () const
 
bool IsMaxLevel () const
 
void InitTalentForLevel ()
 
void BuildPlayerTalentsInfoData (WorldPacket *data)
 
void BuildPetTalentsInfoData (WorldPacket *data)
 
void SendTalentsInfoData (bool pet)
 
void LearnTalent (uint32 talentId, uint32 talentRank, bool command=false)
 
void LearnPetTalent (ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
 
bool addTalent (uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
 
void _removeTalent (PlayerTalentMap::iterator &itr, uint8 specMask)
 
void _removeTalent (uint32 spellId, uint8 specMask)
 
void _removeTalentAurasAndSpells (uint32 spellId)
 
void _addTalentAurasAndSpells (uint32 spellId)
 
bool HasTalent (uint32 spell_id, uint8 spec) const
 
uint32 CalculateTalentsPoints () const
 
void SetBonusTalentCount (uint32 count)
 
uint32 GetBonusTalentCount ()
 
void AddBonusTalent (uint32 count)
 
void RemoveBonusTalent (uint32 count)
 
void UpdateSpecCount (uint8 count)
 
uint8 GetActiveSpec () const
 
uint8 GetActiveSpecMask () const
 
void SetActiveSpec (uint8 spec)
 
uint8 GetSpecsCount () const
 
void SetSpecsCount (uint8 count)
 
void ActivateSpec (uint8 spec)
 
void LoadActions (PreparedQueryResult result)
 
void GetTalentTreePoints (uint8(&specPoints)[3]) const
 
uint8 GetMostPointsTalentTree () const
 
bool HasTankSpec ()
 
bool HasMeleeSpec ()
 
bool HasCasterSpec ()
 
bool HasHealSpec ()
 
uint32 GetSpec (int8 spec=-1)
 
void InitGlyphsForLevel ()
 
void SetGlyphSlot (uint8 slot, uint32 slottype)
 
uint32 GetGlyphSlot (uint8 slot) const
 
void SetGlyph (uint8 slot, uint32 glyph, bool save)
 
uint32 GetGlyph (uint8 slot) const
 
uint32 GetFreePrimaryProfessionPoints () const
 
void SetFreePrimaryProfessions (uint16 profs)
 
void InitPrimaryProfessions ()
 
PlayerSpellMap const & GetSpellMap () const
 
PlayerSpellMapGetSpellMap ()
 
SpellCooldowns const & GetSpellCooldownMap () const
 
SpellCooldownsGetSpellCooldownMap ()
 
SkillStatusMap const & GetSkillStatusMap () const
 
SkillStatusMapGetSkillStatusMap ()
 
void AddSpellMod (SpellModifier *mod, bool apply)
 
bool IsAffectedBySpellmod (SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
 
bool HasSpellMod (SpellModifier *mod, Spell *spell)
 
template<class T >
void ApplySpellMod (uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
 
void RemoveSpellMods (Spell *spell)
 
void RestoreSpellMods (Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void RestoreAllSpellMods (uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void DropModCharge (SpellModifier *mod, Spell *spell)
 
void SetSpellModTakingSpell (Spell *spell, bool apply)
 
bool HasSpellCooldown (uint32 spell_id) const override
 
bool HasSpellItemCooldown (uint32 spell_id, uint32 itemid) const override
 
uint32 GetSpellCooldownDelay (uint32 spell_id) const
 
void AddSpellAndCategoryCooldowns (SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
 
void AddSpellCooldown (uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
 
void _AddSpellCooldown (uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void ModifySpellCooldown (uint32 spellId, int32 cooldown)
 
void SendCooldownEvent (SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
 
void ProhibitSpellSchool (SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
 
void RemoveSpellCooldown (uint32 spell_id, bool update=false)
 
void SendClearCooldown (uint32 spell_id, Unit *target)
 
GlobalCooldownMgrGetGlobalCooldownMgr ()
 
void RemoveCategoryCooldown (uint32 cat)
 
void RemoveArenaSpellCooldowns (bool removeActivePetCooldowns=false)
 
void RemoveAllSpellCooldown ()
 
void _LoadSpellCooldowns (PreparedQueryResult result)
 
void _SaveSpellCooldowns (CharacterDatabaseTransaction trans, bool logout)
 
uint32 GetLastPotionId ()
 
void SetLastPotionId (uint32 item_id)
 
void UpdatePotionCooldown (Spell *spell=nullptr)
 
void setResurrectRequestData (ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
 
void clearResurrectRequestData ()
 
bool isResurrectRequestedBy (ObjectGuid guid) const
 
bool isResurrectRequested () const
 
void ResurectUsingRequestData ()
 
uint8 getCinematic () const
 
void setCinematic (uint8 cine)
 
ActionButtonaddActionButton (uint8 button, uint32 action, uint8 type)
 
void removeActionButton (uint8 button)
 
ActionButton const * GetActionButton (uint8 button)
 
void SendInitialActionButtons () const
 
void SendActionButtons (uint32 state) const
 
bool IsActionButtonDataValid (uint8 button, uint32 action, uint8 type)
 
void UpdatePvPState ()
 
void UpdateFFAPvPState (bool reset=true)
 
void SetPvP (bool state)
 
void UpdatePvP (bool state, bool _override=false)
 
void UpdateZone (uint32 newZone, uint32 newArea)
 
void UpdateArea (uint32 newArea)
 
void SetNeedZoneUpdate (bool needUpdate)
 
void UpdateZoneDependentAuras (uint32 zone_id)
 
void UpdateAreaDependentAuras (uint32 area_id)
 
void UpdateAfkReport (time_t currTime)
 checks the 15 afk reports per 5 minutes limit
 
void UpdatePvPFlag (time_t currTime)
 
void UpdateFFAPvPFlag (time_t currTime)
 
void UpdateContestedPvP (uint32 currTime)
 
void SetContestedPvPTimer (uint32 newTime)
 
void ResetContestedPvP ()
 
void UpdateDuelFlag (time_t currTime)
 
void CheckDuelDistance (time_t currTime)
 
void DuelComplete (DuelCompleteType type)
 
void SendDuelCountdown (uint32 counter)
 
bool IsGroupVisibleFor (Player const *p) const
 
bool IsInSameGroupWith (Player const *p) const
 
bool IsInSameRaidWith (Player const *p) const
 
void UninviteFromGroup ()
 
void RemoveFromGroup (RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT)
 
void SendUpdateToOutOfRangeGroupMembers ()
 
void SetInGuild (uint32 GuildId)
 
void SetRank (uint8 rankId)
 
uint8 GetRank () const
 
void SetGuildIdInvited (uint32 GuildId)
 
uint32 GetGuildId () const
 
GuildGetGuild () const
 
uint32 GetGuildIdInvited ()
 
void SetInArenaTeam (uint32 ArenaTeamId, uint8 slot, uint8 type)
 
void SetArenaTeamInfoField (uint8 slot, ArenaTeamInfoType type, uint32 value)
 
uint32 GetArenaPersonalRating (uint8 slot) const
 
uint32 GetArenaTeamId (uint8 slot) const
 
void SetArenaTeamIdInvited (uint32 ArenaTeamId)
 
uint32 GetArenaTeamIdInvited ()
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
Difficulty GetStoredRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty dungeon_difficulty)
 
void SetRaidDifficulty (Difficulty raid_difficulty)
 
void StoreRaidMapDifficulty ()
 
bool UpdateSkill (uint32 skill_id, uint32 step)
 
bool UpdateSkillPro (uint16 SkillId, int32 Chance, uint32 step)
 
bool UpdateCraftSkill (uint32 spellid)
 
bool UpdateGatherSkill (uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
 
bool UpdateFishingSkill ()
 
uint32 GetBaseDefenseSkillValue () const
 
uint32 GetBaseWeaponSkillValue (WeaponAttackType attType) const
 
uint32 GetSpellByProto (ItemTemplate *proto)
 
float GetHealthBonusFromStamina ()
 
float GetManaBonusFromIntellect ()
 
bool UpdateStats (Stats stat) override
 
bool UpdateAllStats () override
 
void ApplySpellPenetrationBonus (int32 amount, bool apply)
 
void UpdateResistances (uint32 school) override
 
void UpdateArmor () override
 
void UpdateMaxHealth () override
 
void UpdateMaxPower (Powers power) override
 
void ApplyFeralAPBonus (int32 amount, bool apply)
 
void UpdateAttackPowerAndDamage (bool ranged=false) override
 
void UpdateShieldBlockValue ()
 
void ApplySpellPowerBonus (int32 amount, bool apply)
 
void UpdateSpellDamageAndHealingBonus ()
 
void ApplyRatingMod (CombatRating cr, int32 value, bool apply)
 
void UpdateRating (CombatRating cr)
 
void UpdateAllRatings ()
 
void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
 
void UpdateDefenseBonusesMod ()
 
void RecalculateRating (CombatRating cr)
 
float GetMeleeCritFromAgility ()
 
void GetDodgeFromAgility (float &diminishing, float &nondiminishing)
 
float GetMissPercentageFromDefence () const
 
float GetSpellCritFromIntellect ()
 
float OCTRegenHPPerSpirit ()
 
float OCTRegenMPPerSpirit ()
 
float GetRatingMultiplier (CombatRating cr) const
 
float GetRatingBonusValue (CombatRating cr) const
 
uint32 GetBaseSpellPowerBonus ()
 
int32 GetSpellPenetrationItemMod () const
 
float GetExpertiseDodgeOrParryReduction (WeaponAttackType attType) const
 
void UpdateBlockPercentage ()
 
void UpdateCritPercentage (WeaponAttackType attType)
 
void UpdateAllCritPercentages ()
 
void UpdateParryPercentage ()
 
void UpdateDodgePercentage ()
 
void UpdateMeleeHitChances ()
 
void UpdateRangedHitChances ()
 
void UpdateSpellHitChances ()
 
void UpdateAllSpellCritChances ()
 
void UpdateSpellCritChance (uint32 school)
 
void UpdateArmorPenetration (int32 amount)
 
void UpdateExpertise (WeaponAttackType attType)
 
void ApplyManaRegenBonus (int32 amount, bool apply)
 
void ApplyHealthRegenBonus (int32 amount, bool apply)
 
void UpdateManaRegen ()
 
void UpdateRuneRegen (RuneType rune)
 
ObjectGuid GetLootGUID () const
 
void SetLootGUID (ObjectGuid guid)
 
void RemovedInsignia (Player *looterPlr)
 
WorldSessionGetSession () const
 
void SetSession (WorldSession *sess)
 
void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) override
 
void DestroyForPlayer (Player *target, bool onDeath=false) const override
 
void SendLogXPGain (uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
 
void SendAttackSwingCantAttack ()
 
void SendAttackSwingCancelAttack ()
 
void SendAttackSwingDeadTarget ()
 
void SendAttackSwingNotInRange ()
 
void SendAttackSwingBadFacingAttack ()
 
void SendAutoRepeatCancel (Unit *target)
 
void SendExplorationExperience (uint32 Area, uint32 Experience)
 
void SendDungeonDifficulty (bool IsInGroup)
 
void SendRaidDifficulty (bool IsInGroup, int32 forcedDifficulty=-1)
 
void SendResetInstanceSuccess (uint32 MapId)
 
void SendResetInstanceFailed (uint32 reason, uint32 MapId)
 
void SendResetFailedNotify (uint32 mapid)
 
bool UpdatePosition (float x, float y, float z, float orientation, bool teleport=false) override
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessTerrainStatusUpdate () override
 
void SendMessageToSet (WorldPacket const *data, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist=false) const
 
void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const override
 
void SendTeleportAckPacket ()
 
CorpseGetCorpse () const
 
void SpawnCorpseBones (bool triggerSave=true)
 
CorpseCreateCorpse ()
 
void RemoveCorpse ()
 
void KillPlayer ()
 
bool HasCorpse () const
 
WorldLocation GetCorpseLocation () const
 
uint32 GetResurrectionSpellId ()
 
void ResurrectPlayer (float restore_percent, bool applySickness=false)
 
void BuildPlayerRepop ()
 
void RepopAtGraveyard ()
 
void SendDurabilityLoss ()
 
void DurabilityLossAll (double percent, bool inventory)
 
void DurabilityLoss (Item *item, double percent)
 
void DurabilityPointsLossAll (int32 points, bool inventory)
 
void DurabilityPointsLoss (Item *item, int32 points)
 
void DurabilityPointLossForEquipSlot (EquipmentSlots slot)
 
uint32 DurabilityRepairAll (bool cost, float discountMod, bool guildBank)
 
uint32 DurabilityRepair (uint16 pos, bool cost, float discountMod, bool guildBank)
 
void UpdateMirrorTimers ()
 
void StopMirrorTimers ()
 
bool IsMirrorTimerActive (MirrorTimerType type)
 
void SetMovement (PlayerMovementType pType)
 
bool CanJoinConstantChannelInZone (ChatChannelsEntry const *channel, AreaTableEntry const *zone)
 
void JoinedChannel (Channel *c)
 
void LeftChannel (Channel *c)
 
void CleanupChannels ()
 
void ClearChannelWatch ()
 
void UpdateLFGChannel ()
 
void UpdateLocalChannels (uint32 newZone)
 
void UpdateDefense ()
 
void UpdateWeaponSkill (Unit *victim, WeaponAttackType attType, Item *item=nullptr)
 
void UpdateCombatSkills (Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
 
void SetSkill (uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
 
uint16 GetMaxSkillValue (uint32 skill) const
 
uint16 GetPureMaxSkillValue (uint32 skill) const
 
uint16 GetSkillValue (uint32 skill) const
 
uint16 GetBaseSkillValue (uint32 skill) const
 
uint16 GetPureSkillValue (uint32 skill) const
 
int16 GetSkillPermBonusValue (uint32 skill) const
 
int16 GetSkillTempBonusValue (uint32 skill) const
 
uint16 GetSkillStep (uint16 skill) const
 
bool HasSkill (uint32 skill) const
 
void learnSkillRewardedSpells (uint32 id, uint32 value)
 
WorldLocationGetTeleportDest ()
 
bool IsBeingTeleported () const
 
bool IsBeingTeleportedNear () const
 
bool IsBeingTeleportedFar () const
 
void SetSemaphoreTeleportNear (time_t tm)
 
void SetSemaphoreTeleportFar (time_t tm)
 
time_t GetSemaphoreTeleportNear () const
 
time_t GetSemaphoreTeleportFar () const
 
void ProcessDelayedOperations ()
 
uint32 GetDelayedOperations () const
 
void ScheduleDelayedOperation (uint32 operation)
 
void CheckAreaExploreAndOutdoor ()
 
TeamId GetTeamId (bool original=false) const
 
void SetFactionForRace (uint8 race)
 
void setTeamId (TeamId teamid)
 
void InitDisplayIds ()
 
bool IsAtGroupRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtLootRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtRecruitAFriendDistance (WorldObject const *pOther) const
 
void RewardPlayerAndGroupAtKill (Unit *victim, bool isBattleGround)
 
void RewardPlayerAndGroupAtEvent (uint32 creature_id, WorldObject *pRewardSource)
 
bool isHonorOrXPTarget (Unit *victim) const
 
bool GetsRecruitAFriendBonus (bool forXP)
 
uint8 GetGrantableLevels ()
 
void SetGrantableLevels (uint8 val)
 
ReputationMgrGetReputationMgr ()
 
ReputationMgr const & GetReputationMgr () const
 
ReputationRank GetReputationRank (uint32 faction_id) const
 
void RewardReputation (Unit *victim)
 
void RewardReputation (Quest const *quest)
 
float CalculateReputationGain (ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
 
void UpdateSkillsForLevel ()
 
void UpdateSkillsToMaxSkillsForLevel ()
 
void ModifySkillBonus (uint32 skillid, int32 val, bool talent)
 
void RewardExtraBonusTalentPoints (uint32 bonusTalentPoints)
 
void UpdateHonorFields ()
 
bool RewardHonor (Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
 
uint32 GetHonorPoints () const
 
uint32 GetArenaPoints () const
 
void ModifyHonorPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 
void ModifyArenaPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 If trans is specified, honor save query will be added to trans.
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans.
 
void SetHonorPoints (uint32 value)
 
void SetArenaPoints (uint32 value)
 
void SaveHealthBeforeDuel ()
 
void SaveManaBeforeDuel ()
 
void RestoreHealthAfterDuel ()
 
void RestoreManaAfterDuel ()
 
SpellCooldowns GetSpellCooldowns () const
 
void SetDrunkValue (uint8 newDrunkValue, uint32 itemId=0)
 
uint8 GetDrunkValue () const
 
int32 GetFakeDrunkValue () const
 
void UpdateInvisibilityDrunkDetect ()
 
uint32 GetDeathTimer () const
 
uint32 GetCorpseReclaimDelay (bool pvp) const
 
void UpdateCorpseReclaimDelay ()
 
int32 CalculateCorpseReclaimDelay (bool load=false)
 
void SendCorpseReclaimDelay (uint32 delay)
 
uint32 GetShieldBlockValue () const override
 
bool CanParry () const
 
void SetCanParry (bool value)
 
bool CanBlock () const
 
void SetCanBlock (bool value)
 
bool CanTitanGrip () const
 
void SetCanTitanGrip (bool value)
 
bool CanTameExoticPets () const
 
void SetRegularAttackTime ()
 
void SetBaseModValue (BaseModGroup modGroup, BaseModType modType, float value)
 
void HandleBaseModValue (BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
 
float GetBaseModValue (BaseModGroup modGroup, BaseModType modType) const
 
float GetTotalBaseModValue (BaseModGroup modGroup) const
 
float GetTotalPercentageModValue (BaseModGroup modGroup) const
 
void _ApplyAllStatBonuses ()
 
void _RemoveAllStatBonuses ()
 
void ResetAllPowers ()
 
SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
 
void _ApplyWeaponDependentAuraMods (Item *item, WeaponAttackType attackType, bool apply)
 
void _ApplyWeaponDependentAuraCritMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyWeaponDependentAuraDamageMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyItemMods (Item *item, uint8 slot, bool apply)
 
void _RemoveAllItemMods ()
 
void _ApplyAllItemMods ()
 
void _ApplyAllLevelScaleItemMods (bool apply)
 
void _ApplyItemBonuses (ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
 
void _ApplyWeaponDamage (uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
 
void _ApplyAmmoBonuses ()
 
bool EnchantmentFitsRequirements (uint32 enchantmentcondition, int8 slot)
 
void ToggleMetaGemsActive (uint8 exceptslot, bool apply)
 
void CorrectMetaGemEnchants (uint8 slot, bool apply)
 
void InitDataForForm (bool reapplyMods=false)
 
void ApplyItemEquipSpell (Item *item, bool apply, bool form_change=false)
 
void ApplyEquipSpell (SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
 
void UpdateEquipSpellsAtFormChange ()
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
 
void CastItemUseSpell (Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item *item, ItemTemplate const *proto)
 
void SendEquipmentSetList ()
 
void SetEquipmentSet (uint32 index, EquipmentSet eqset)
 
void DeleteEquipmentSet (uint64 setGuid)
 
void SendInitWorldStates (uint32 zone, uint32 area)
 
void SendUpdateWorldState (uint32 variable, uint32 value) const
 
void SendDirectMessage (WorldPacket const *data) const
 
void SendBGWeekendWorldStates ()
 
void SendBattlefieldWorldStates ()
 
void GetAurasForTarget (Unit *target, bool force=false)
 
void SendLoot (ObjectGuid guid, LootType loot_type)
 
void SendLootError (ObjectGuid guid, LootError error)
 
void SendLootRelease (ObjectGuid guid)
 
void SendNotifyLootItemRemoved (uint8 lootSlot)
 
void SendNotifyLootMoneyRemoved ()
 
bool InBattleground () const
 
bool InArena () const
 
uint32 GetBattlegroundId () const
 
BattlegroundTypeId GetBattlegroundTypeId () const
 
uint32 GetCurrentBattlegroundQueueSlot () const
 
bool IsInvitedForBattlegroundInstance () const
 
bool IsCurrentBattlegroundRandom () const
 
BGDataGetBGData ()
 
void SetBGData (BGData &bgdata)
 
BattlegroundGetBattleground (bool create=false) const
 
bool InBattlegroundQueue (bool ignoreArena=false) const
 
bool IsDeserter () const
 
BattlegroundQueueTypeId GetBattlegroundQueueTypeId (uint32 index) const
 
uint32 GetBattlegroundQueueIndex (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool IsInvitedForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool InBattlegroundQueueForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
void SetBattlegroundId (uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
 
uint32 AddBattlegroundQueueId (BattlegroundQueueTypeId val)
 
bool HasFreeBattlegroundQueueId () const
 
void RemoveBattlegroundQueueId (BattlegroundQueueTypeId val)
 
void SetInviteForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
 
bool IsInvitedForBattlegroundInstance (uint32 instanceId) const
 
TeamId GetBgTeamId () const
 
void LeaveBattleground (Battleground *bg=nullptr)
 
bool CanJoinToBattleground () const
 
bool CanReportAfkDueToLimit ()
 
void ReportedAfkBy (Player *reporter)
 This player has been blamed to be inactive in a battleground.
 
void ClearAfkReports ()
 
bool GetBGAccessByLevel (BattlegroundTypeId bgTypeId) const
 
bool CanUseBattlegroundObject (GameObject *gameobject) const
 
bool isTotalImmune () const
 
bool CanCaptureTowerPoint () const
 
bool GetRandomWinner ()
 
void SetRandomWinner (bool isWinner)
 
OutdoorPvPGetOutdoorPvP () const
 
bool IsOutdoorPvPActive ()
 
bool IsImmuneToEnvironmentalDamage ()
 
uint32 EnvironmentalDamage (EnviromentalDamage type, uint32 damage)
 
void UpdateSpeakTime (ChatFloodThrottle::Index index)
 
bool CanSpeak () const
 
void UpdateFallInformationIfNeed (MovementInfo const &minfo, uint16 opcode)
 
void SetFallInformation (uint32 time, float z)
 
void HandleFall (MovementInfo const &movementInfo)
 
bool canFlyInZone (uint32 mapid, uint32 zone, SpellInfo const *bySpell)
 
void SetClientControl (Unit *target, bool allowMove, bool packetOnly=false)
 
void SetMover (Unit *target)
 
void SetSeer (WorldObject *target)
 
void SetViewpoint (WorldObject *target, bool apply)
 
WorldObjectGetViewpoint () const
 
void StopCastingCharm (Aura *except=nullptr)
 
void StopCastingBindSight (Aura *except=nullptr)
 
uint32 GetSaveTimer () const
 
void SetSaveTimer (uint32 timer)
 
void SaveRecallPosition ()
 
void SetHomebind (WorldLocation const &loc, uint32 areaId)
 
WorldLocation GetStartPosition () const
 
WorldLocation const & GetEntryPoint () const
 
void SetEntryPoint ()
 
bool HaveAtClient (WorldObject const *u) const
 
bool HaveAtClient (ObjectGuid guid) const
 
bool IsNeverVisible () const override
 
bool IsVisibleGloballyFor (Player const *player) const
 
void GetInitialVisiblePackets (Unit *target)
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void UpdateVisibilityForPlayer (bool mapChange=false)
 
void UpdateVisibilityOf (WorldObject *target)
 
void UpdateTriggerVisibility ()
 
template<class T >
void UpdateVisibilityOf (T *target, UpdateData &data, std::vector< Unit * > &visibleNow)
 
bool HasAtLoginFlag (AtLoginFlags f) const
 
void SetAtLoginFlag (AtLoginFlags f)
 
void RemoveAtLoginFlag (AtLoginFlags flags, bool persist=false)
 
bool IsUsingLfg ()
 
bool inRandomLfgDungeon ()
 
uint32 GetTemporaryUnsummonedPetNumber () const
 
void SetTemporaryUnsummonedPetNumber (uint32 petnumber)
 
void UnsummonPetTemporaryIfAny ()
 
void ResummonPetTemporaryUnSummonedIfAny ()
 
bool IsPetNeedBeTemporaryUnsummoned () const
 
bool CanResummonPet (uint32 spellid)
 
void SendCinematicStart (uint32 CinematicSequenceId) const
 
void SendMovieStart (uint32 MovieId)
 
uint32 DoRandomRoll (uint32 minimum, uint32 maximum)
 
uint16 GetMaxSkillValueForLevel () const
 
bool IsFFAPvP ()
 
bool IsPvP ()
 
void UpdateHomebindTime (uint32 time)
 
void BindToInstance ()
 
void SetPendingBind (uint32 instanceId, uint32 bindTimer)
 
bool HasPendingBind () const
 
uint32 GetPendingBind () const
 
void SendRaidInfo ()
 
void SendSavedInstances ()
 
void PrettyPrintRequirementsQuestList (const std::vector< const ProgressionRequirement * > &missingQuests) const
 
void PrettyPrintRequirementsAchievementsList (const std::vector< const ProgressionRequirement * > &missingAchievements) const
 
void PrettyPrintRequirementsItemsList (const std::vector< const ProgressionRequirement * > &missingItems) const
 
bool Satisfy (DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
 
bool CheckInstanceLoginValid ()
 
bool CheckInstanceCount (uint32 instanceId) const
 
void AddInstanceEnterTime (uint32 instanceId, time_t enterTime)
 
uint32 GetLastPetNumber () const
 
void SetLastPetNumber (uint32 petnumber)
 
uint32 GetLastPetSpell () const
 
void SetLastPetSpell (uint32 petspell)
 
GroupGetGroupInvite ()
 
void SetGroupInvite (Group *group)
 
GroupGetGroup ()
 
const GroupGetGroup () const
 
GroupReferenceGetGroupRef ()
 
void SetGroup (Group *group, int8 subgroup=-1)
 
uint8 GetSubGroup () const
 
uint32 GetGroupUpdateFlag () const
 
void SetGroupUpdateFlag (uint32 flag)
 
uint64 GetAuraUpdateMaskForRaid () const
 
void SetAuraUpdateMaskForRaid (uint8 slot)
 
PlayerGetNextRandomRaidMember (float radius)
 
PartyResult CanUninviteFromGroup (ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
 
void SetBattlegroundOrBattlefieldRaid (Group *group, int8 subgroup=-1)
 
void RemoveFromBattlegroundOrBattlefieldRaid ()
 
GroupGetOriginalGroup ()
 
GroupReferenceGetOriginalGroupRef ()
 
uint8 GetOriginalSubGroup () const
 
void SetOriginalGroup (Group *group, int8 subgroup=-1)
 
void SetPassOnGroupLoot (bool bPassOnGroupLoot)
 
bool GetPassOnGroupLoot () const
 
MapReferenceGetMapRef ()
 
void SetMap (Map *map) override
 
void ResetMap () override
 
bool CanTeleport ()
 
void SetCanTeleport (bool value)
 
bool CanKnockback ()
 
void SetCanKnockback (bool value)
 
bool isAllowedToLoot (Creature const *creature)
 
DeclinedName const * GetDeclinedNames () const
 
uint8 GetRunesState () const
 
RuneType GetBaseRune (uint8 index) const
 
RuneType GetCurrentRune (uint8 index) const
 
uint32 GetRuneCooldown (uint8 index) const
 
uint32 GetGracePeriod (uint8 index) const
 
uint32 GetRuneBaseCooldown (uint8 index, bool skipGrace)
 
bool IsBaseRuneSlotsOnCooldown (RuneType runeType) const
 
RuneType GetLastUsedRune ()
 
void SetLastUsedRune (RuneType type)
 
void SetBaseRune (uint8 index, RuneType baseRune)
 
void SetCurrentRune (uint8 index, RuneType currentRune)
 
void SetRuneCooldown (uint8 index, uint32 cooldown)
 
void SetGracePeriod (uint8 index, uint32 period)
 
void SetRuneConvertAura (uint8 index, AuraEffect const *aura)
 
void AddRuneByAuraEffect (uint8 index, RuneType newType, AuraEffect const *aura)
 
void RemoveRunesByAuraEffect (AuraEffect const *aura)
 
void RestoreBaseRune (uint8 index)
 
void ConvertRune (uint8 index, RuneType newType)
 
void ResyncRunes (uint8 count)
 
void AddRunePower (uint8 index)
 
void InitRunes ()
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
void ResetAchievements ()
 
void CheckAllAchievementCriteria ()
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void CompletedAchievement (AchievementEntry const *entry)
 
AchievementMgrGetAchievementMgr () const
 
void SetCreationTime (Seconds creationTime)
 
Seconds GetCreationTime () const
 
bool HasTitle (uint32 bitIndex) const
 
bool HasTitle (CharTitlesEntry const *title) const
 
void SetTitle (CharTitlesEntry const *title, bool lost=false)
 
void SetCurrentTitle (CharTitlesEntry const *title, bool clear=false)
 
bool CanSeeSpellClickOn (Creature const *creature) const
 
bool CanSeeVendor (Creature const *creature) const
 
uint32 GetChampioningFaction () const
 
void SetChampioningFaction (uint32 faction)
 
float GetAverageItemLevel ()
 
float GetAverageItemLevelForDF ()
 
void ClearWhisperWhiteList ()
 
void AddWhisperWhiteList (ObjectGuid guid)
 
bool IsInWhisperWhiteList (ObjectGuid guid)
 
void RemoveFromWhisperWhiteList (ObjectGuid guid)
 
bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool SetCanFly (bool apply, bool packetOnly=false) override
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
bool SetWaterWalking (bool apply, bool packetOnly=false) override
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.
 
bool SetFeatherFall (bool apply, bool packetOnly=false) override
 
bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool CanFly () const override
 
bool CanEnterWater () const override
 
void AdditionalSavingAddMask (uint8 mask)
 
bool IsSpectator () const
 
void SetIsSpectator (bool on)
 
bool NeedSendSpectatorData () const
 
void SetPendingSpectatorForBG (uint32 bgInstanceId)
 
bool HasPendingSpectatorForBG (uint32 bgInstanceId) const
 
void SetPendingSpectatorInviteInstanceId (uint32 bgInstanceId)
 
uint32 GetPendingSpectatorInviteInstanceId () const
 
bool HasReceivedSpectatorResetFor (ObjectGuid guid)
 
void ClearReceivedSpectatorResetFor ()
 
void AddReceivedSpectatorResetFor (ObjectGuid guid)
 
void RemoveReceivedSpectatorResetFor (ObjectGuid guid)
 
void setRuneWeaponGUID (ObjectGuid guid)
 
ObjectGuid getRuneWeaponGUID ()
 
bool CanSeeDKPet () const
 
void SetShowDKPet (bool on)
 
void PrepareCharmAISpells ()
 
bool NeedToSaveGlyphs ()
 
void SetNeedToSaveGlyphs (bool val)
 
uint32 GetMountBlockId ()
 
void SetMountBlockId (uint32 mount)
 
float GetRealParry () const
 
float GetRealDodge () const
 
const PlayerTalentMapGetTalentMap () const
 
uint32 GetNextSave () const
 
SpellModList const & GetSpellModList (uint32 type) const
 
void SetServerSideVisibility (ServerSideVisibilityType type, AccountTypes sec)
 
void SetServerSideVisibilityDetect (ServerSideVisibilityType type, AccountTypes sec)
 
void SetFarSightDistance (float radius)
 
void ResetFarSightDistance ()
 
Optional< float > GetFarSightDistance () const
 
float GetSightRange (WorldObject const *target=nullptr) const override
 
std::string GetPlayerName ()
 
PlayerSetting GetPlayerSetting (std::string source, uint8 index)
 
void UpdatePlayerSetting (std::string source, uint8 index, uint32 value)
 
void SendSystemMessage (std::string_view msg, bool escapeCharacters=false)
 
std::string GetDebugInfo () const override
 
const PendingSpellCastRequestGetCastRequest (uint32 category) const
 
bool CanExecutePendingSpellCastRequest (SpellInfo const *spellInfo)
 
void ExecuteOrCancelSpellCastRequest (PendingSpellCastRequest *castRequest, bool isCancel=false)
 
bool CanRequestSpellCast (SpellInfo const *spellInfo)
 
- Public Member Functions inherited from Unit
 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void UpdateAllResistances ()
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetSwim (bool enable)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle, bool disableWarning=false)
 
Position GetNearPosition (float dist, float angle, bool disableWarning=false)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius, bool disableWarning=false)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< Player >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< Player > &m)
 
void RemoveFromGrid ()
 

Static Public Member Functions

static bool BuildEnumData (PreparedQueryResult result, WorldPacket *data)
 
static uint8 GetAttackBySlot (uint8 slot)
 
static bool IsInventoryPos (uint16 pos)
 
static bool IsInventoryPos (uint8 bag, uint8 slot)
 
static bool IsEquipmentPos (uint16 pos)
 
static bool IsEquipmentPos (uint8 bag, uint8 slot)
 
static bool IsBagPos (uint16 pos)
 
static bool IsBankPos (uint16 pos)
 
static bool IsBankPos (uint8 bag, uint8 slot)
 
static uint32 GetDefaultGossipMenuForSource (WorldObject *source)
 
static uint32 GetZoneIdFromDB (ObjectGuid guid)
 
static bool LoadPositionFromDB (uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
 
static bool IsValidGender (uint8 Gender)
 
static void Customize (CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
 
static void SavePositionInDB (uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
 
static void SavePositionInDB (WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
 
static void DeleteFromDB (ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
 
static void DeleteOldCharacters ()
 
static void DeleteOldCharacters (uint32 keepDays)
 
static void DeleteOldRecoveryItems ()
 
static void DeleteOldRecoveryItems (uint32 keepDays)
 
static void RemoveFromGroup (Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
static void RemovePetitionsAndSigns (ObjectGuid guid, uint32 type)
 
static uint32 GetArenaTeamIdFromDB (ObjectGuid guid, uint8 slot)
 
static void LeaveAllArenaTeams (ObjectGuid guid)
 
static void ResetInstances (ObjectGuid guid, uint8 method, bool isRaid)
 Reset all solo instances and optionally send a message on success for each.
 
static void OfflineResurrect (ObjectGuid const guid, CharacterDatabaseTransaction trans)
 
static TeamId TeamIdForRace (uint8 race)
 
static DrunkenState GetDrunkenstateByValue (uint8 value)
 
- Static Public Member Functions inherited from Unit
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

std::string autoReplyMsg
 
PlayerTaxi m_taxi
 
time_t m_logintime
 
time_t m_Last_tick
 
uint32 m_Played_time [MAX_PLAYED_TIME_INDEX]
 
bool m_mailsUpdated
 
uint8 unReadMails
 
time_t m_nextMailDelivereTime
 
ItemMap mMitems
 
PvPInfo pvpInfo
 
std::unique_ptr< DuelInfoduel
 
PlayerMenuPlayerTalkClass
 
std::vector< ItemSetEffect * > ItemSetEff
 
SafeUnitPointer m_mover
 
WorldObjectm_seer
 
std::set< Unit * > m_isInSharedVisionOf
 
uint32 m_recallMap
 
float m_recallX
 
float m_recallY
 
float m_recallZ
 
float m_recallO
 
uint32 m_homebindMapId
 
uint16 m_homebindAreaId
 
float m_homebindX
 
float m_homebindY
 
float m_homebindZ
 
GuidUnorderedSet m_clientGUIDs
 
std::vector< Unit * > m_newVisible
 
uint8 m_forced_speed_changes [MAX_MOVE_TYPE]
 
DFQuestsDoneList m_DFQuests
 
uint32 m_HomebindTimer
 
bool m_InstanceValid
 
Spellm_spellModTakingSpell
 
bool isDebugAreaTriggers
 
uint32 m_pendingSpectatorForBG
 
uint32 m_pendingSpectatorInviteInstanceId
 
GuidSet m_receivedSpectatorResetFor
 
ObjectGuid m_drwGUID
 
uint32 m_charmUpdateTimer
 
std::deque< PendingSpellCastRequestSpellQueue
 
- Public Attributes inherited from Unit
uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Static Public Attributes

static std::unordered_map< int, bgZoneRefbgZoneIdToFillWorldStates = {}
 

Protected Types

typedef std::set< uint32QuestSet
 
typedef std::set< uint32SeasonalQuestSet
 
typedef std::unordered_map< uint32, SeasonalQuestSetSeasonalEventQuestMap
 
typedef std::list< Channel * > JoinedChannelsList
 
- Protected Types inherited from Unit
typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

uint32 GetSpellQueueWindow () const
 
void ProcessSpellQueue ()
 
void _LoadActions (PreparedQueryResult result)
 
void _LoadAuras (PreparedQueryResult result, uint32 timediff)
 
void _LoadGlyphAuras ()
 
void _LoadInventory (PreparedQueryResult result, uint32 timeDiff)
 
void _LoadMail (PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
 
void _LoadQuestStatus (PreparedQueryResult result)
 
void _LoadQuestStatusRewarded (PreparedQueryResult result)
 
void _LoadDailyQuestStatus (PreparedQueryResult result)
 
void _LoadWeeklyQuestStatus (PreparedQueryResult result)
 
void _LoadMonthlyQuestStatus (PreparedQueryResult result)
 
void _LoadSeasonalQuestStatus (PreparedQueryResult result)
 
void _LoadRandomBGStatus (PreparedQueryResult result)
 
void _LoadGroup ()
 
void _LoadSkills (PreparedQueryResult result)
 
void _LoadSpells (PreparedQueryResult result)
 
void _LoadFriendList (PreparedQueryResult result)
 
bool _LoadHomeBind (PreparedQueryResult result)
 
void _LoadDeclinedNames (PreparedQueryResult result)
 
void _LoadArenaTeamInfo ()
 
void _LoadEquipmentSets (PreparedQueryResult result)
 
void _LoadEntryPointData (PreparedQueryResult result)
 
void _LoadGlyphs (PreparedQueryResult result)
 
void _LoadTalents (PreparedQueryResult result)
 
void _LoadInstanceTimeRestrictions (PreparedQueryResult result)
 
void _LoadBrewOfTheMonth (PreparedQueryResult result)
 
void _LoadCharacterSettings (PreparedQueryResult result)
 
void _LoadPetStable (uint8 petStableSlots, PreparedQueryResult result)
 
void _SaveActions (CharacterDatabaseTransaction trans)
 
void _SaveAuras (CharacterDatabaseTransaction trans, bool logout)
 
void _SaveInventory (CharacterDatabaseTransaction trans)
 
void _SaveMail (CharacterDatabaseTransaction trans)
 
void _SaveQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveDailyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveWeeklyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveMonthlyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSeasonalQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSpells (CharacterDatabaseTransaction trans)
 
void _SaveEquipmentSets (CharacterDatabaseTransaction trans)
 
void _SaveEntryPoint (CharacterDatabaseTransaction trans)
 
void _SaveGlyphs (CharacterDatabaseTransaction trans)
 
void _SaveTalents (CharacterDatabaseTransaction trans)
 
void _SaveStats (CharacterDatabaseTransaction trans)
 
void _SaveCharacter (bool create, CharacterDatabaseTransaction trans)
 
void _SaveInstanceTimeRestrictions (CharacterDatabaseTransaction trans)
 
void _SavePlayerSettings (CharacterDatabaseTransaction trans)
 
void HandleSobering ()
 The player sobers by 1% every 9 seconds.
 
void SendMirrorTimer (MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
 
void StopMirrorTimer (MirrorTimerType Type)
 
void HandleDrowning (uint32 time_diff)
 
int32 getMaxTimer (MirrorTimerType timer)
 
void outDebugValues () const
 
void SendQuestGiverStatusMultiple ()
 
bool CanAlwaysSee (WorldObject const *obj) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
- Protected Member Functions inherited from Unit
 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Static Protected Member Functions

static Item_LoadMailedItem (ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
 

Protected Attributes

WhisperListContainer WhisperList
 
bool m_NeedToSaveGlyphs
 
uint32 m_MountBlockId
 
float m_realDodge
 
float m_realParry
 
uint32 m_charmAISpells [NUM_CAI_SPELLS]
 
uint32 m_AreaID
 
uint32 m_regenTimerCount
 
uint32 m_foodEmoteTimerCount
 
float m_powerFraction [MAX_POWERS]
 
uint32 m_contestedPvPTimer
 
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES_BgBattlegroundQueueID
 
BGData m_bgData
 
bool m_IsBGRandomWinner
 
EntryPointData m_entryPointData
 
QuestSet m_timedquests
 
QuestSet m_weeklyquests
 
QuestSet m_monthlyquests
 
SeasonalEventQuestMap m_seasonalquests
 
ObjectGuid m_divider
 
uint32 m_ingametime
 
time_t m_lastHonorUpdateTime
 
ObjectGuid m_lootGuid
 
TeamId m_team
 
uint32 m_nextSave
 
uint16 m_additionalSaveTimer
 
uint8 m_additionalSaveMask
 
uint16 m_hostileReferenceCheckTimer
 
std::array< ChatFloodThrottle, ChatFloodThrottle::MAXm_chatFloodData
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Difficulty m_raidMapDifficulty
 
uint32 m_atLoginFlags
 
Itemm_items [PLAYER_SLOTS_COUNT]
 
uint32 m_currentBuybackSlot
 
std::vector< Item * > m_itemUpdateQueue
 
bool m_itemUpdateQueueBlocked
 
uint32 m_ExtraFlags
 
QuestStatusMap m_QuestStatus
 
QuestStatusSaveMap m_QuestStatusSave
 
RewardedQuestSet m_RewardedQuests
 
QuestStatusSaveMap m_RewardedQuestsSave
 
SkillStatusMap mSkillStatus
 
uint32 m_GuildIdInvited
 
uint32 m_ArenaTeamIdInvited
 
PlayerMails m_mail
 
PlayerSpellMap m_spells
 
PlayerTalentMap m_talents
 
uint32 m_lastPotionId
 
GlobalCooldownMgr m_GlobalCooldownMgr
 
uint8 m_activeSpec
 
uint8 m_specsCount
 
uint32 m_Glyphs [MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
 
ActionButtonList m_actionButtons
 
float m_auraBaseMod [BASEMOD_END][MOD_END]
 
int32 m_baseRatingValue [MAX_COMBAT_RATING]
 
uint32 m_baseSpellPower
 
uint32 m_baseFeralAP
 
uint32 m_baseManaRegen
 
uint32 m_baseHealthRegen
 
int32 m_spellPenetrationItemMod
 
SpellModList m_spellMods [MAX_SPELLMOD]
 
EnchantDurationList m_enchantDuration
 
ItemDurationList m_itemDuration
 
ItemDurationList m_itemSoulboundTradeable
 
std::mutex m_soulboundTradableLock
 
ObjectGuid m_resurrectGUID
 
uint32 m_resurrectMap
 
float m_resurrectX
 
float m_resurrectY
 
float m_resurrectZ
 
uint32 m_resurrectHealth
 
uint32 m_resurrectMana
 
WorldSessionm_session
 
JoinedChannelsList m_channels
 
uint8 m_cinematic
 
TradeDatam_trade
 
bool m_DailyQuestChanged
 
bool m_WeeklyQuestChanged
 
bool m_MonthlyQuestChanged
 
bool m_SeasonalQuestChanged
 
time_t m_lastDailyQuestTime
 
uint32 m_drunkTimer
 
uint32 m_weaponChangeTimer
 
uint32 m_zoneUpdateId
 
uint32 m_zoneUpdateTimer
 
uint32 m_areaUpdateId
 
uint32 m_deathTimer
 
time_t m_deathExpireTime
 
uint32 m_WeaponProficiency
 
uint32 m_ArmorProficiency
 
bool m_canParry
 
bool m_canBlock
 
bool m_canTitanGrip
 
uint8 m_swingErrorMsg
 
float m_ammoDPS
 
time_t _restTime
 
uint32 _innTriggerId
 
float _restBonus
 
uint32 _restFlagMask
 
uint32 m_resetTalentsCost
 
time_t m_resetTalentsTime
 
uint32 m_usedTalentCount
 
uint32 m_questRewardTalentCount
 
uint32 m_extraBonusTalentCount
 
PlayerSocialm_social
 
GroupReference m_group
 
GroupReference m_originalGroup
 
Groupm_groupInvite
 
uint32 m_groupUpdateMask
 
uint64 m_auraRaidUpdateMask
 
bool m_bPassOnGroupLoot
 
uint32 m_lastpetnumber
 
time_t m_summon_expire
 
uint32 m_summon_mapid
 
float m_summon_x
 
float m_summon_y
 
float m_summon_z
 
bool m_summon_asSpectator
 
DeclinedNamem_declinedname
 
Runesm_runes
 
EquipmentSets m_EquipmentSets
 
uint8 m_grantableLevels
 
bool m_needZoneUpdate
 
- Protected Attributes inherited from Unit
UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef GuidSet RefundableItemsSet
 

Private Member Functions

InventoryResult CanStoreItem_InSpecificSlot (uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
 
InventoryResult CanStoreItem_InBag (uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
InventoryResult CanStoreItem_InInventorySlots (uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
Item_StoreItem (uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
 
Item_LoadItem (CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
 
void SendRefundInfo (Item *item)
 
void RefundItem (Item *item)
 
void AddKnownCurrency (uint32 itemId)
 
void AdjustQuestReqItemCount (Quest const *quest, QuestStatusData &questStatusData)
 
bool MustDelayTeleport () const
 
void SetMustDelayTeleport (bool setting)
 
bool HasDelayedTeleport () const
 
void SetHasDelayedTeleport (bool setting)
 
void UpdateCharmedAI ()
 

Private Attributes

CinematicMgr_cinematicMgr
 
RefundableItemsSet m_refundableItems
 
MapReference m_mapRef
 
uint32 m_lastFallTime
 
float m_lastFallZ
 
int32 m_MirrorTimer [MAX_TIMERS]
 
uint8 m_MirrorTimerFlags
 
uint8 m_MirrorTimerFlagsLast
 
bool m_isInWater
 
WorldLocation teleportStore_dest
 
uint32 teleportStore_options
 
time_t mSemaphoreTeleport_Near
 
time_t mSemaphoreTeleport_Far
 
uint32 m_DelayedOperations
 
bool m_bMustDelayTeleport
 
bool m_bHasDelayedTeleport
 
bool m_canTeleport
 
bool m_canKnockback
 
std::unique_ptr< PetStablem_petStable
 
uint32 m_temporaryUnsummonedPetNumber
 
uint32 m_oldpetspell
 
AchievementMgrm_achievementMgr
 
ReputationMgrm_reputationMgr
 
SpellCooldowns m_spellCooldowns
 
uint32 m_ChampioningFaction
 
InstanceTimeMap _instanceResetTimes
 
uint32 _pendingBindId
 
uint32 _pendingBindTimer
 
uint32 _activeCheats
 
uint32 healthBeforeDuel
 
uint32 manaBeforeDuel
 
bool m_isInstantFlightOn
 
uint32 m_flightSpellActivated
 
WorldLocation _corpseLocation
 
Optional< float > _farSightDistance = { }
 
bool _wasOutdoor
 
PlayerSettingMap m_charSettingsMap
 
Seconds m_creationTime
 

Friends

class WorldSession
 
class CinematicMgr
 
void Item::AddToUpdateQueueOf (Player *player)
 
void Item::RemoveFromUpdateQueueOf (Player *player)
 

Detailed Description

Member Typedef Documentation

◆ DFQuestsDoneList

typedef std::set<uint32> Player::DFQuestsDoneList

◆ ItemMap

typedef std::unordered_map<ObjectGuid::LowType, Item*> Player::ItemMap

◆ JoinedChannelsList

typedef std::list<Channel*> Player::JoinedChannelsList
protected

◆ QuestSet

typedef std::set<uint32> Player::QuestSet
protected

◆ RefundableItemsSet

◆ SeasonalEventQuestMap

typedef std::unordered_map<uint32, SeasonalQuestSet> Player::SeasonalEventQuestMap
protected

◆ SeasonalQuestSet

typedef std::set<uint32> Player::SeasonalQuestSet
protected

Constructor & Destructor Documentation

◆ Player()

Player::Player ( WorldSession session)
explicit
147 : Unit(true), m_mover(this)
148{
149#ifdef _MSC_VER
150#pragma warning(default:4355)
151#endif
152
155
157
158 m_session = session;
159
160 m_ingametime = 0;
161
162 m_ExtraFlags = 0;
163
164 m_spellModTakingSpell = nullptr;
165 //m_pad = 0;
166
167 // players always accept
169 SetAcceptWhispers(true);
170
174
175 m_regenTimer = 0;
179
182
183 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
184
185 m_areaUpdateId = 0;
187
188 m_needZoneUpdate = false;
189
193
195
196 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
197
198 m_social = nullptr;
199
200 // group is initialized in the reference constructor
201 SetGroupInvite(nullptr);
204 m_bPassOnGroupLoot = false;
205
208
210
213
215 m_bMustDelayTeleport = false;
216 m_bHasDelayedTeleport = false;
218 m_canTeleport = false;
219 m_canKnockback = false;
220
221 m_trade = nullptr;
222
223 m_cinematic = 0;
224
227
228 m_DailyQuestChanged = false;
230
231 for (uint8 i = 0; i < MAX_TIMERS; i++)
233
236 m_isInWater = false;
237 m_drunkTimer = 0;
238 m_deathTimer = 0;
240
242
243 m_swingErrorMsg = 0;
244
245 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
246 {
248 _BgBattlegroundQueueID[j].invitedToInstance = 0;
249 }
250
257 m_canParry = false;
258 m_canBlock = false;
259 m_canTitanGrip = false;
260 m_ammoDPS = 0.0f;
261
263 //cache for UNIT_CREATED_BY_SPELL to allow
264 //returning reagents for temporarily removed pets
265 //when dying/logging out
266 m_oldpetspell = 0;
267 m_lastpetnumber = 0;
268
270 _restTime = 0;
271 _innTriggerId = 0;
272 _restBonus = 0;
273 _restFlagMask = 0;
275
276 m_mailsUpdated = false;
277 unReadMails = 0;
278 m_nextMailDelivereTime = time_t(0);
279
283
284 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
286
288
289 m_HomebindTimer = 0;
290 m_InstanceValid = true;
294
295 m_lastPotionId = 0;
296
297 m_activeSpec = 0;
298 m_specsCount = 1;
299
300 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
301 {
302 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
303 m_Glyphs[i][g] = 0;
304 }
305
306 for (uint8 i = 0; i < BASEMOD_END; ++i)
307 {
308 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
309 m_auraBaseMod[i][PCT_MOD] = 1.0f;
310 }
311
312 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
313 m_baseRatingValue[i] = 0;
314
316 m_baseFeralAP = 0;
317 m_baseManaRegen = 0;
320
321 // Honor System
323
324 m_IsBGRandomWinner = false;
325
326 // Player summoning
327 m_summon_expire = 0;
328 m_summon_mapid = 0;
329 m_summon_x = 0.0f;
330 m_summon_y = 0.0f;
331 m_summon_z = 0.0f;
332 m_summon_asSpectator = false;
333
334 //m_mover = this;
336 m_seer = this;
337
338 m_recallMap = 0;
339 m_recallX = 0;
340 m_recallY = 0;
341 m_recallZ = 0;
342 m_recallO = 0;
343
344 m_homebindMapId = 0;
346 m_homebindX = 0;
347 m_homebindY = 0;
348 m_homebindZ = 0;
349
351
352 m_declinedname = nullptr;
353
354 m_isActive = true;
355
356 m_runes = nullptr;
357
358 m_lastFallTime = 0;
359 m_lastFallZ = 0;
360
362
364
365 sWorld->IncreasePlayerCount();
366
368
369 for (uint8 i = 0; i < MAX_POWERS; ++i)
370 m_powerFraction[i] = 0;
371
372 isDebugAreaTriggers = false;
373
374 m_WeeklyQuestChanged = false;
375
376 m_MonthlyQuestChanged = false;
377
379
380 SetPendingBind(0, 0);
381
383
384 m_creationTime = 0s;
385
386 _cinematicMgr = new CinematicMgr(this);
387
389 m_reputationMgr = new ReputationMgr(this);
390
391 // Ours
392 m_NeedToSaveGlyphs = false;
393 m_MountBlockId = 0;
394 m_realDodge = 0.0f;
395 m_realParry = 0.0f;
398
400
401 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
402 m_charmAISpells[i] = 0;
403
404 m_applyResilience = true;
405
406 m_isInstantFlightOn = true;
407
408 _wasOutdoor = true;
409 sScriptMgr->OnConstructPlayer(this);
410}
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
@ CONFIG_INTERVAL_SAVE
Definition IWorld.h:214
@ TYPEID_PLAYER
Definition ObjectGuid.h:36
@ TYPEMASK_PLAYER
Definition ObjectGuid.h:50
@ NUM_CAI_SPELLS
Definition Player.h:930
@ CHEAT_NONE
Definition Player.h:1003
@ BUYBACK_SLOT_START
Definition Player.h:729
#define MAX_TIMERS
Definition Player.h:583
#define DISABLED_MIRROR_TIMER
Definition Player.h:584
@ PLAYED_TIME_TOTAL
Definition Player.h:860
@ PLAYED_TIME_LEVEL
Definition Player.h:861
@ UNDERWATER_NONE
Definition Player.h:100
@ AT_LOGIN_NONE
Definition Player.h:604
@ PLAYER_SLOTS_COUNT
Definition Player.h:672
#define sScriptMgr
Definition ScriptMgr.h:714
@ MAX_POWERS
Definition SharedDefines.h:276
#define MAX_TALENT_SPECS
Definition SharedDefines.h:675
#define MAX_GLYPH_SLOT_INDEX
Definition SharedDefines.h:676
@ BATTLEGROUND_QUEUE_NONE
Definition SharedDefines.h:3620
@ TEAM_NEUTRAL
Definition SharedDefines.h:762
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition SharedDefines.h:176
#define MAX_MOVE_TYPE
Definition UnitDefines.h:360
@ FLAT_MOD
Definition Unit.h:189
@ PCT_MOD
Definition Unit.h:190
#define MAX_COMBAT_RATING
Definition Unit.h:244
@ BASEMOD_END
Definition Unit.h:184
@ PLAYER_END
Definition UpdateFields.h:392
Definition AchievementMgr.h:293
Definition Item.h:220
uint16 m_objectType
Definition Object.h:245
uint16 m_valuesCount
Definition Object.h:259
TypeID m_objectTypeId
Definition Object.h:247
Definition GossipDef.h:259
bool m_canParry
Definition Player.h:2881
time_t m_summon_expire
Definition Player.h:2914
bool m_needZoneUpdate
Definition Player.h:2931
uint16 m_additionalSaveTimer
Definition Player.h:2788
float m_ammoDPS
Definition Player.h:2885
uint32 m_temporaryUnsummonedPetNumber
Definition Player.h:2985
uint32 m_ChampioningFaction
Definition Player.h:2993
bool m_bHasDelayedTeleport
Definition Player.h:2978
bool m_InstanceValid
Definition Player.h:2444
time_t m_deathExpireTime
Definition Player.h:2877
ReputationMgr * m_reputationMgr
Definition Player.h:2989
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition Player.h:2832
float m_homebindZ
Definition Player.h:2381
uint32 m_lastFallTime
Definition Player.h:2962
uint32 m_lastPotionId
Definition Player.h:2821
CinematicMgr * _cinematicMgr
Definition Player.h:2941
bool m_canTeleport
Definition Player.h:2979
uint32 m_usedTalentCount
Definition Player.h:2895
friend class CinematicMgr
Definition Player.h:1083
bool m_MonthlyQuestChanged
Definition Player.h:2865
PlayerSocial * m_social
Definition Player.h:2900
uint32 m_homebindMapId
Definition Player.h:2377
Seconds m_creationTime
Definition Player.h:3017
void SetAcceptWhispers(bool on)
Definition Player.h:1174
float m_summon_z
Definition Player.h:2918
time_t m_lastHonorUpdateTime
Definition Player.h:2781
time_t _restTime
Definition Player.h:2888
SafeUnitPointer m_mover
Definition Player.h:2341
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2408
uint32 _activeCheats
Definition Player.h:2999
uint32 m_resetTalentsCost
Definition Player.h:2893
uint8 m_MirrorTimerFlags
Definition Player.h:2966
uint32 m_atLoginFlags
Definition Player.h:2796
uint32 m_ExtraFlags
Definition Player.h:2804
float m_recallX
Definition Player.h:2368
uint32 m_ingametime
Definition Player.h:2711
float m_recallO
Definition Player.h:2371
bool m_WeeklyQuestChanged
Definition Player.h:2864
uint8 unReadMails
Definition Player.h:1668
uint32 m_pendingSpectatorInviteInstanceId
Definition Player.h:2596
void SetGroupInvite(Group *group)
Definition Player.h:2475
uint32 m_DelayedOperations
Definition Player.h:2976
TradeData * m_trade
Definition Player.h:2861
float m_realParry
Definition Player.h:2667
uint32 m_nextSave
Definition Player.h:2787
uint32 m_zoneUpdateTimer
Definition Player.h:2873
bool m_mailsUpdated
Definition Player.h:1604
time_t mSemaphoreTeleport_Far
Definition Player.h:2974
float _restBonus
Definition Player.h:2890
uint32 m_foodEmoteTimerCount
Definition Player.h:2673
uint32 m_baseFeralAP
Definition Player.h:2835
float m_summon_y
Definition Player.h:2917
WorldObject * m_seer
Definition Player.h:2342
float m_summon_x
Definition Player.h:2916
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition Player.h:2669
uint8 m_additionalSaveMask
Definition Player.h:2789
bool m_bMustDelayTeleport
Definition Player.h:2977
bool m_SeasonalQuestChanged
Definition Player.h:2866
TeamId m_team
Definition Player.h:2786
uint32 m_areaUpdateId
Definition Player.h:2874
uint8 m_specsCount
Definition Player.h:2826
uint32 m_extraBonusTalentCount
Definition Player.h:2897
WorldSession * GetSession() const
Definition Player.h:2005
float m_powerFraction[MAX_POWERS]
Definition Player.h:2674
uint32 m_oldpetspell
Definition Player.h:2986
Runes * m_runes
Definition Player.h:2922
uint32 m_currentBuybackSlot
Definition Player.h:2799
uint32 m_deathTimer
Definition Player.h:2876
uint32 m_regenTimerCount
Definition Player.h:2672
AchievementMgr * m_achievementMgr
Definition Player.h:2988
uint8 m_swingErrorMsg
Definition Player.h:2884
time_t m_nextMailDelivereTime
Definition Player.h:1669
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition Player.h:2687
void clearResurrectRequestData()
Definition Player.h:1833
bool m_bPassOnGroupLoot
Definition Player.h:2908
float m_recallZ
Definition Player.h:2370
uint32 m_pendingSpectatorForBG
Definition Player.h:2595
bool m_DailyQuestChanged
Definition Player.h:2863
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition Player.h:2828
Difficulty m_dungeonDifficulty
Definition Player.h:2792
uint32 m_weaponChangeTimer
Definition Player.h:2870
uint32 m_WeaponProficiency
Definition Player.h:2879
float m_realDodge
Definition Player.h:2666
bool m_canKnockback
Definition Player.h:2980
bool m_isInstantFlightOn
Definition Player.h:3005
time_t mSemaphoreTeleport_Near
Definition Player.h:2973
DeclinedName * m_declinedname
Definition Player.h:2921
bool m_IsBGRandomWinner
Definition Player.h:2689
uint32 m_drunkTimer
Definition Player.h:2869
uint32 m_contestedPvPTimer
Definition Player.h:2675
float m_homebindY
Definition Player.h:2380
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition Player.h:1202
uint32 m_baseSpellPower
Definition Player.h:2834
bool _wasOutdoor
Definition Player.h:3013
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition Player.h:2446
uint32 _restFlagMask
Definition Player.h:2891
uint8 m_grantableLevels
Definition Player.h:2929
Item * m_items[PLAYER_SLOTS_COUNT]
Definition Player.h:2798
uint16 m_homebindAreaId
Definition Player.h:2378
Difficulty m_raidMapDifficulty
Definition Player.h:2794
uint32 m_zoneUpdateId
Definition Player.h:2872
bool m_isInWater
Definition Player.h:2968
uint8 m_MirrorTimerFlagsLast
Definition Player.h:2967
time_t m_lastDailyQuestTime
Definition Player.h:2867
time_t m_resetTalentsTime
Definition Player.h:2894
uint32 m_baseHealthRegen
Definition Player.h:2837
uint32 m_charmUpdateTimer
Definition Player.h:2607
uint32 m_summon_mapid
Definition Player.h:2915
Difficulty m_raidDifficulty
Definition Player.h:2793
float m_lastFallZ
Definition Player.h:2963
bool m_summon_asSpectator
Definition Player.h:2919
uint32 m_baseManaRegen
Definition Player.h:2836
time_t m_logintime
Definition Player.h:1200
int32 m_MirrorTimer[MAX_TIMERS]
Definition Player.h:2965
uint32 _innTriggerId
Definition Player.h:2889
uint32 m_ArenaTeamIdInvited
Definition Player.h:2816
uint32 m_recallMap
Definition Player.h:2367
float m_recallY
Definition Player.h:2369
uint32 m_questRewardTalentCount
Definition Player.h:2896
bool m_NeedToSaveGlyphs
Definition Player.h:2662
uint32 m_HomebindTimer
Definition Player.h:2443
uint64 m_auraRaidUpdateMask
Definition Player.h:2907
bool m_canTitanGrip
Definition Player.h:2883
bool m_canBlock
Definition Player.h:2882
uint8 m_cinematic
Definition Player.h:2859
int32 m_spellPenetrationItemMod
Definition Player.h:2838
uint8 m_activeSpec
Definition Player.h:2825
WorldSession * m_session
Definition Player.h:2854
uint32 m_flightSpellActivated
Definition Player.h:3007
uint32 teleportStore_options
Definition Player.h:2972
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition Player.h:2833
uint32 m_ArmorProficiency
Definition Player.h:2880
bool isDebugAreaTriggers
Definition Player.h:2564
uint32 m_groupUpdateMask
Definition Player.h:2906
Spell * m_spellModTakingSpell
Definition Player.h:2560
uint32 m_lastpetnumber
Definition Player.h:2911
time_t m_Last_tick
Definition Player.h:1201
PlayerMenu * PlayerTalkClass
Definition Player.h:2247
uint32 m_GuildIdInvited
Definition Player.h:2815
float m_homebindX
Definition Player.h:2379
uint16 m_hostileReferenceCheckTimer
Definition Player.h:2790
bool m_itemUpdateQueueBlocked
Definition Player.h:2802
uint32 m_MountBlockId
Definition Player.h:2664
Definition ReputationMgr.h:57
void Initialize(Unit *defVal)
Definition UnitUtils.h:51
Definition Unit.h:636
int32 m_regenTimer
Definition Unit.h:2105
bool m_ControlledByPlayer
Definition Unit.h:2015
SafeUnitPointer m_movedByPlayer
Definition Unit.h:1992
bool m_applyResilience
Definition Unit.h:2118
bool m_isActive
Definition Object.h:639
#define sWorld
Definition World.h:443
bool IsPlayerAccount(uint32 gmlevel)
Definition AccountMgr.cpp:305
uint32 GetSecurity(uint32 accountId)
Definition AccountMgr.cpp:238
Seconds GetGameTime()
Definition GameTime.cpp:38

References _activeCheats, _BgBattlegroundQueueID, _cinematicMgr, _innTriggerId, _restBonus, _restFlagMask, _restTime, _wasOutdoor, AT_LOGIN_NONE, BASEMOD_END, BATTLEGROUND_QUEUE_NONE, BUYBACK_SLOT_START, CHEAT_NONE, CinematicMgr, clearResurrectRequestData(), CONFIG_INTERVAL_SAVE, DISABLED_MIRROR_TIMER, DUNGEON_DIFFICULTY_NORMAL, FLAT_MOD, GameTime::GetGameTime(), GetSession(), SafeUnitPointer::Initialize(), isDebugAreaTriggers, AccountMgr::IsPlayerAccount(), m_achievementMgr, m_activeSpec, m_additionalSaveMask, m_additionalSaveTimer, m_ammoDPS, Unit::m_applyResilience, m_areaUpdateId, m_ArenaTeamIdInvited, m_ArmorProficiency, m_atLoginFlags, m_auraBaseMod, m_auraRaidUpdateMask, m_baseFeralAP, m_baseHealthRegen, m_baseManaRegen, m_baseRatingValue, m_baseSpellPower, m_bHasDelayedTeleport, m_bMustDelayTeleport, m_bPassOnGroupLoot, m_canBlock, m_canKnockback, m_canParry, m_canTeleport, m_canTitanGrip, m_ChampioningFaction, m_charmAISpells, m_charmUpdateTimer, m_cinematic, m_contestedPvPTimer, Unit::m_ControlledByPlayer, m_creationTime, m_currentBuybackSlot, m_DailyQuestChanged, m_deathExpireTime, m_deathTimer, m_declinedname, m_DelayedOperations, m_drunkTimer, m_dungeonDifficulty, m_extraBonusTalentCount, m_ExtraFlags, m_flightSpellActivated, m_foodEmoteTimerCount, m_forced_speed_changes, m_Glyphs, m_grantableLevels, m_groupUpdateMask, m_GuildIdInvited, m_homebindAreaId, m_homebindMapId, m_HomebindTimer, m_homebindX, m_homebindY, m_homebindZ, m_hostileReferenceCheckTimer, m_ingametime, m_InstanceValid, WorldObject::m_isActive, m_IsBGRandomWinner, m_isInstantFlightOn, m_isInWater, m_items, m_itemUpdateQueueBlocked, m_Last_tick, m_lastDailyQuestTime, m_lastFallTime, m_lastFallZ, m_lastHonorUpdateTime, m_lastpetnumber, m_lastPotionId, m_logintime, m_mailsUpdated, m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, m_MonthlyQuestChanged, m_MountBlockId, Unit::m_movedByPlayer, m_NeedToSaveGlyphs, m_needZoneUpdate, m_nextMailDelivereTime, m_nextSave, Object::m_objectType, Object::m_objectTypeId, m_oldpetspell, m_pendingSpectatorForBG, m_pendingSpectatorInviteInstanceId, m_Played_time, m_powerFraction, m_questRewardTalentCount, m_raidDifficulty, m_raidMapDifficulty, m_realDodge, m_realParry, m_recallMap, m_recallO, m_recallX, m_recallY, m_recallZ, Unit::m_regenTimer, m_regenTimerCount, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_runes, m_SeasonalQuestChanged, m_seer, m_session, m_social, m_specsCount, m_spellModTakingSpell, m_spellPenetrationItemMod, m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, m_swingErrorMsg, m_team, m_temporaryUnsummonedPetNumber, m_trade, m_usedTalentCount, Object::m_valuesCount, m_weaponChangeTimer, m_WeaponProficiency, m_WeeklyQuestChanged, m_zoneUpdateId, m_zoneUpdateTimer, MAX_COMBAT_RATING, MAX_GLYPH_SLOT_INDEX, MAX_MOVE_TYPE, MAX_POWERS, MAX_TALENT_SPECS, MAX_TIMERS, mSemaphoreTeleport_Far, mSemaphoreTeleport_Near, NUM_CAI_SPELLS, PCT_MOD, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_END, PLAYER_MAX_BATTLEGROUND_QUEUES, PLAYER_SLOTS_COUNT, PlayerTalkClass, RAID_DIFFICULTY_10MAN_NORMAL, SetAcceptWhispers(), SetGroupInvite(), SetPendingBind(), sScriptMgr, sWorld, TEAM_NEUTRAL, teleportStore_options, TYPEID_PLAYER, TYPEMASK_PLAYER, UNDERWATER_NONE, and unReadMails.

◆ ~Player()

Player::~Player ( )
override
413{
414 sScriptMgr->OnDestructPlayer(this);
415
416 // it must be unloaded already in PlayerLogout and accessed only for loggined player
417 //m_social = nullptr;
418
419 // Note: buy back item already deleted from DB when player was saved
420 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
421 delete m_items[i];
422
423 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
424 delete itr->second;
425
426 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
427 delete itr->second;
428
429 //all mailed items should be deleted, also all mail should be deallocated
430 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
431 {
432 delete *itr;
433 }
434
435 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
436 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
437
438 delete PlayerTalkClass;
439
440 for (std::size_t x = 0; x < ItemSetEff.size(); x++)
441 delete ItemSetEff[x];
442
443 delete m_declinedname;
444 delete m_runes;
445 delete m_achievementMgr;
446 delete m_reputationMgr;
447 delete _cinematicMgr;
448
449 sWorld->DecreasePlayerCount();
450
451 if (!m_isInSharedVisionOf.empty())
452 {
453 do
454 {
455 Unit* u = *(m_isInSharedVisionOf.begin());
456 u->RemovePlayerFromVision(this);
457 } while (!m_isInSharedVisionOf.empty());
458 }
459}
ItemMap mMitems
Definition Player.h:1673
PlayerSpellMap m_spells
Definition Player.h:2819
std::vector< ItemSetEffect * > ItemSetEff
Definition Player.h:2248
PlayerMails m_mail
Definition Player.h:2818
PlayerTalentMap m_talents
Definition Player.h:2820
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2343
void RemovePlayerFromVision(Player *player)
Definition Unit.cpp:11240

References _cinematicMgr, ItemSetEff, m_achievementMgr, m_declinedname, m_isInSharedVisionOf, m_items, m_mail, m_reputationMgr, m_runes, m_spells, m_talents, mMitems, PLAYER_SLOTS_COUNT, PlayerTalkClass, Unit::RemovePlayerFromVision(), sScriptMgr, and sWorld.

Member Function Documentation

◆ _addSpell()

bool Player::_addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  temporary,
bool  learnFromSkill = false 
)
Todo:
confirm if rogues start wth lockpicking skill at level 1 but only recieve the spell to use it at level 16
3117{
3118 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3119
3120 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3121 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3122 return false;
3123
3124 // pussywizard: already found and temporary, nothing to do
3125 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3126 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3127 return false;
3128
3129 // xinef: send packet so client can properly recognize this new spell
3130 // xinef: ignore passive spells and spells with learn effect
3131 // xinef: send spells with no aura effects (ie dual wield)
3132 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3133 SendLearnPacket(spellInfo->Id, true);
3134
3135 // xinef: DO NOT allow to learn spell with effect learn spell!
3136 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3137 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3138 {
3139 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3140 if (spellInfo->Effects[i].IsEffect())
3141 {
3142 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3143 {
3144 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3145 return false;
3146 //ABORT();
3147 }
3148 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3150 }
3151
3152 return false;
3153 }
3154
3155 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3156 {
3157 // pussywizard: do nothing if already set as wanted
3158 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3159 return false;
3160
3161 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3162 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3163 bool spellIsNew = true;
3164
3165 // pussywizard: present in m_spells, not removed, already in current spec, already active
3166 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3167 spellIsNew = false;
3168
3169 // pussywizard: update info in m_spells
3170 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3171 itr->second->State = PLAYERSPELL_CHANGED;
3172 itr->second->Active = true;
3173 itr->second->specMask |= addSpecMask;
3174
3175 if (!spellIsNew)
3176 return true;
3177 }
3178 else // pussywizard: not found in m_spells
3179 {
3180 PlayerSpell* newspell = new PlayerSpell;
3181 newspell->Active = true;
3183 newspell->specMask = addSpecMask;
3184
3185 m_spells[spellId] = newspell;
3186 }
3187
3188 // pussywizard: return if spell not in current spec
3189 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3190 if (!((1 << GetActiveSpec()) & addSpecMask))
3191 return true;
3192
3193 // xinef: do not add spells with effect learn spell
3194 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3195 {
3196 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3197 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3198 return false;
3199 //ABORT();
3200 }
3201 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3202 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3203 {
3204 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3205 CastSpell(this, spellId, true);
3206 }
3207 // pussywizard: cast and return, learnt spells will update profession count, etc.
3208 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3209 {
3210 CastSpell(this, spellId, true);
3211 return false;
3212 }
3213
3214 // xinef: unapply aura stats if dont meet requirements
3215 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3216 if (!isBeingLoaded())
3217 if (Aura* aura = GetAura(spellId))
3218 {
3219 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3220 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3221 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3222 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3223 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3224 }
3225
3226 // pussywizard: update free primary prof points
3227 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3228 {
3229 if (spellInfo->IsPrimaryProfessionFirstRank())
3230 SetFreePrimaryProfessions(freeProfs - 1);
3231 }
3232
3233 uint16 maxskill = GetMaxSkillValueForLevel();
3234 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3235 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3236 // xinef: set appropriate skill value
3237 if (spellLearnSkill)
3238 {
3239 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3240 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3241 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3242
3243 if (skill_value < spellLearnSkill->value)
3244 skill_value = spellLearnSkill->value;
3245 if (skill_max_value < new_skill_max_value)
3246 skill_max_value = new_skill_max_value;
3247
3248 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3249 }
3250 else
3251 {
3252 // not ranked skills
3253 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3254 {
3255 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3256 if (!pSkill)
3257 {
3258 continue;
3259 }
3260
3262 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3263 if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
3264 {
3265 LearnDefaultSkill(pSkill->id, 0);
3266 }
3267
3268 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3269 {
3270 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3271 {
3272 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3273 {
3274 SetHas310Flyer(true);
3275 }
3276 }
3277 }
3278 }
3279 }
3280
3281 // xinef: update achievement criteria
3282 if (!GetSession()->PlayerLoading())
3283 {
3284 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3285 {
3288 }
3290 }
3291
3292 return true;
3293}
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition DBCEnums.h:361
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition DBCEnums.h:218
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1636
std::uint16_t uint16
Definition Define.h:108
#define LOG_INFO(filterType__,...)
Definition Log.h:165
#define SPEC_MASK_ALL
Definition Player.h:177
@ PLAYERSPELL_REMOVED
Definition Player.h:122
@ PLAYERSPELL_UNCHANGED
Definition Player.h:119
@ PLAYERSPELL_CHANGED
Definition Player.h:120
@ PLAYERSPELL_NEW
Definition Player.h:121
@ PLAYERSPELL_TEMPORARY
Definition Player.h:123
@ SPELL_EFFECT_LEARN_SPELL
Definition SharedDefines.h:814
@ SPELL_EFFECT_SKILL_STEP
Definition SharedDefines.h:822
SpellAttr0
Definition SharedDefines.h:381
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:388
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition SharedDefines.h:389
AuraStateType
Definition SharedDefines.h:1288
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1305
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1315
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1293
@ SKILL_RUNEFORGING
Definition SharedDefines.h:3004
@ SKILL_LOCKPICKING
Definition SharedDefines.h:2975
@ SKILL_MOUNTS
Definition SharedDefines.h:3005
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
#define sSpellMgr
Definition SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition SpellMgr.h:584
Definition SpellAuras.h:87
bool IsInWorld() const
Definition Object.h:107
ObjectGuid GetGUID() const
Definition Object.h:113
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2169
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition Player.cpp:3116
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition Player.cpp:3304
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition Player.cpp:11914
bool isBeingLoaded() const override
Definition PlayerStorage.cpp:4913
void SendLearnPacket(uint32 spellId, bool learn)
Definition Player.cpp:3052
uint16 GetMaxSkillValueForLevel() const
Definition Player.cpp:16274
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition Player.cpp:3295
uint16 GetPureSkillValue(uint32 skill) const
Definition Player.cpp:5536
bool HasSkill(uint32 skill) const
Definition Player.cpp:5450
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition Player.cpp:5506
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition Player.cpp:5350
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition Player.cpp:3498
uint8 GetActiveSpec() const
Definition Player.h:1748
void SetHas310Flyer(bool on)
Definition Player.h:1184
void SetFreePrimaryProfessions(uint16 profs)
Definition Player.h:1777
uint32 GetFreePrimaryProfessionPoints() const
Definition Player.h:1776
Definition SpellInfo.h:316
uint32 Stances
Definition SpellInfo.h:333
bool IsPassive() const
Definition SpellInfo.cpp:1098
uint32 Id
Definition SpellInfo.h:320
bool HasAnyAura() const
Definition SpellInfo.cpp:901
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
bool IsPrimaryProfessionFirstRank() const
Definition SpellInfo.cpp:983
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition SpellMgr.cpp:459
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5614
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10606
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1178
Definition Player.h:127
PlayerSpellState State
Definition Player.h:128
bool Active
Definition Player.h:129
uint8 specMask
Definition Player.h:130
std::string ToString() const
Definition Position.cpp:52
Definition DBCStructure.h:1582
uint32 id
Definition DBCStructure.h:1583
Definition SpellMgr.h:574
uint16 value
Definition SpellMgr.h:577
uint16 step
Definition SpellMgr.h:576
uint16 maxvalue
Definition SpellMgr.h:578
uint16 skill
Definition SpellMgr.h:575

References _addSpell(), ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, PlayerSpell::Active, AURA_EFFECT_HANDLE_REAL, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Unit::CastSpell(), SpellMgr::CheckSpellValid(), SpellInfo::Effects, GetActiveSpec(), Unit::GetAura(), GetFreePrimaryProfessionPoints(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetSession(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), Unit::HasAuraState(), SpellInfo::HasEffect(), HasSkill(), SpellInfo::Id, SkillLineEntry::id, isBeingLoaded(), Object::IsInWorld(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), SpellInfo::IsPrimaryProfessionFirstRank(), LearnDefaultSkill(), learnSpell(), LOG_INFO, m_activeSpec, m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, SendLearnPacket(), SetFreePrimaryProfessions(), SetHas310Flyer(), SetSkill(), SpellLearnSkillNode::skill, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LOCKPICKING, SKILL_MOUNTS, SKILL_RUNEFORGING, SPEC_MASK_ALL, PlayerSpell::specMask, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_SKILL_STEP, sSkillLineStore, sSpellMgr, SpellInfo::Stances, PlayerSpell::State, SpellLearnSkillNode::step, Position::ToString(), UpdateAchievementCriteria(), and SpellLearnSkillNode::value.

Referenced by _addSpell(), _addTalentAurasAndSpells(), addSpell(), AuraEffect::HandleAuraModShapeshift(), and AuraEffect::HandleAuraOverrideSpells().

◆ _AddSpellCooldown()

void Player::_AddSpellCooldown ( uint32  spell_id,
uint16  categoryId,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
11104{
11105 SpellCooldown sc;
11106 sc.end = GameTime::GetGameTimeMS().count() + end_time;
11107 sc.category = categoryId;
11108 sc.itemid = itemid;
11109 sc.maxduration = end_time;
11110 sc.sendToSpectator = false;
11111 sc.needSendToClient = needSendToClient;
11112
11114 {
11115 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
11116 {
11117 sc.sendToSpectator = true;
11118 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
11119 }
11120 }
11121
11122 m_spellCooldowns[spellid] = std::move(sc);
11123}
#define SPECTATOR_COOLDOWN_MAX
Definition ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition ArenaSpectator.h:36
constexpr auto IN_MILLISECONDS
Definition Common.h:53
bool NeedSendSpectatorData() const
Definition Player.cpp:15437
bool HasActiveSpell(uint32 spell) const
Definition Player.cpp:3904
SpellCooldowns m_spellCooldowns
Definition Player.h:2991
Map * FindMap() const
Definition Object.h:537
void SendCommand_Cooldown(T *o, ObjectGuid targetGUID, const char *prefix, uint32 id, uint32 dur, uint32 maxdur)
Definition ArenaSpectator.h:89
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43
Definition Player.h:199
uint32 itemid
Definition Player.h:202
bool sendToSpectator
Definition Player.h:204
bool needSendToClient
Definition Player.h:205
uint32 end
Definition Player.h:200
uint32 maxduration
Definition Player.h:203
uint16 category
Definition Player.h:201

References SpellCooldown::category, SpellCooldown::end, WorldObject::FindMap(), GameTime::GetGameTimeMS(), Object::GetGUID(), HasActiveSpell(), IN_MILLISECONDS, SpellCooldown::itemid, m_spellCooldowns, SpellCooldown::maxduration, NeedSendSpectatorData(), SpellCooldown::needSendToClient, ArenaSpectator::SendCommand_Cooldown(), SpellCooldown::sendToSpectator, SPECTATOR_COOLDOWN_MAX, and SPECTATOR_COOLDOWN_MIN.

Referenced by _LoadSpellCooldowns(), AddSpellAndCategoryCooldowns(), and AddSpellCooldown().

◆ _addTalentAurasAndSpells()

void Player::_addTalentAurasAndSpells ( uint32  spellId)
3036{
3037 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
3038 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3039 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3040 {
3041 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3042 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3043 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3044 }
3045 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3046 {
3047 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3048 CastSpell(this, spellId, true);
3049 }
3050}

References _addSpell(), Unit::CastSpell(), SpellInfo::Effects, SpellInfo::HasAttribute(), SpellInfo::HasEffect(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), MAX_SPELL_EFFECTS, SPEC_MASK_ALL, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, and SpellInfo::Stances.

Referenced by ActivateSpec(), and addTalent().

◆ _ApplyAllItemMods()

void Player::_ApplyAllItemMods ( )
7599{
7600 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7601
7602 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7603 {
7604 if (m_items[i])
7605 {
7606 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7607 continue;
7608
7609 ItemTemplate const* proto = m_items[i]->GetTemplate();
7610 if (!proto)
7611 continue;
7612
7613 uint32 attacktype = Player::GetAttackBySlot(i);
7614 if (attacktype < MAX_ATTACK)
7616
7617 _ApplyItemBonuses(proto, i, true);
7618
7619 if (i == EQUIPMENT_SLOT_RANGED)
7621 }
7622 }
7623
7624 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7625 {
7626 if (m_items[i])
7627 {
7628 ItemTemplate const* proto = m_items[i]->GetTemplate();
7629 if (!proto)
7630 continue;
7631
7632 // item set bonuses not dependent from item broken state
7633 if (proto->ItemSet)
7634 AddItemsSetItem(this, m_items[i]);
7635
7636 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7637 continue;
7638
7639 ApplyItemEquipSpell(m_items[i], true);
7640 ApplyEnchantment(m_items[i], true);
7641 }
7642 }
7643
7644 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7645}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
void AddItemsSetItem(Player *player, Item *item)
Definition Item.cpp:32
@ INVENTORY_SLOT_BAG_END
Definition Player.h:705
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:697
WeaponAttackType
Definition Unit.h:208
@ MAX_ATTACK
Definition Unit.h:212
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
void _ApplyAmmoBonuses()
Definition Player.cpp:7665
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition Player.cpp:7132
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition PlayerStorage.cpp:4304
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition Player.cpp:6626
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition Player.cpp:7028
static uint8 GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:542
bool CanUseAttackType(uint8 attacktype) const
Definition Unit.h:945
Definition ItemTemplate.h:619
uint32 ItemSet
Definition ItemTemplate.h:675

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), AddItemsSetItem(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, and MAX_ATTACK.

Referenced by _ApplyAllStatBonuses(), and _LoadInventory().

◆ _ApplyAllLevelScaleItemMods()

void Player::_ApplyAllLevelScaleItemMods ( bool  apply)
7648{
7649 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7650 {
7651 if (m_items[i])
7652 {
7653 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7654 continue;
7655
7656 ItemTemplate const* proto = m_items[i]->GetTemplate();
7657 if (!proto)
7658 continue;
7659
7660 _ApplyItemMods(m_items[i], i, apply);
7661 }
7662 }
7663}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition Player.cpp:6591

References _ApplyItemMods(), Unit::CanUseAttackType(), GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, and m_items.

Referenced by GiveLevel(), and reset_commandscript::HandleResetLevelCommand().

◆ _ApplyAllStatBonuses()

void Player::_ApplyAllStatBonuses ( )
980{
981 SetCanModifyStats(false);
982
985
986 SetCanModifyStats(true);
987
989}
void _ApplyAllItemMods()
Definition Player.cpp:7598
bool UpdateAllStats() override
Definition StatSystem.cpp:188
void _ApplyAllAuraStatMods()
Definition Unit.cpp:5521
void SetCanModifyStats(bool modifyStats)
Definition Unit.h:1026

References Unit::_ApplyAllAuraStatMods(), _ApplyAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7666{
7667 // check ammo
7669 if (!ammo_id)
7670 return;
7671
7672 float currentAmmoDPS;
7673
7674 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7675 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7676 currentAmmoDPS = 0.0f;
7677 else
7678 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7679
7680 sScriptMgr->OnApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7681
7682 if (currentAmmoDPS == GetAmmoDPS())
7683 return;
7684
7685 m_ammoDPS = currentAmmoDPS;
7686
7687 if (CanModifyStats())
7689}
@ ITEM_CLASS_PROJECTILE
Definition ItemTemplate.h:297
#define sObjectMgr
Definition ObjectMgr.h:1643
@ RANGED_ATTACK
Definition Unit.h:211
@ PLAYER_AMMO_ID
Definition UpdateFields.h:369
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:305
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition Player.cpp:7691
float GetAmmoDPS() const
Definition Player.h:1339
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
bool CanModifyStats() const
Definition Unit.h:1027
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition ItemTemplate.h:651
uint32 Class
Definition ItemTemplate.h:621
float DamageMin
Definition ItemTemplate.h:579
float DamageMax
Definition ItemTemplate.h:580

References Unit::CanModifyStats(), CheckAmmoCompatibility(), ItemTemplate::Class, ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, GetAmmoDPS(), Object::GetUInt32Value(), ITEM_CLASS_PROJECTILE, m_ammoDPS, PLAYER_AMMO_ID, RANGED_ATTACK, sObjectMgr, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and SetAmmo().

◆ _ApplyItemBonuses()

void Player::_ApplyItemBonuses ( ItemTemplate const *  proto,
uint8  slot,
bool  apply,
bool  only_level_scale = false 
)
Deprecated:
item mods
6627{
6628 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6629 return;
6630
6631 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6632 if (only_level_scale && !ssd)
6633 return;
6634
6635 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6636 uint32 ssd_level = GetLevel();
6637 uint32 CustomScalingStatValue = 0;
6638
6639 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6640
6641 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6642
6643 if (ssd && ssd_level > ssd->MaxLevel)
6644 ssd_level = ssd->MaxLevel;
6645
6646 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6647 if (only_level_scale && !ssv)
6648 return;
6649
6650 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6651 {
6652 uint32 statType = 0;
6653 int32 val = 0;
6654 // If set ScalingStatDistribution need get stats and values from it
6655 if (ssv)
6656 {
6657 if (ssd)
6658 {
6659 if (ssd->StatMod[i] < 0)
6660 continue;
6661
6662 statType = ssd->StatMod[i];
6663 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6664 }
6665 else
6666 {
6667 if (i >= proto->StatsCount)
6668 continue;
6669
6670 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6671 sScriptMgr->OnCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6672 }
6673 }
6674 else
6675 {
6676 if (i >= proto->StatsCount)
6677 continue;
6678
6679 statType = proto->ItemStat[i].ItemStatType;
6680 val = proto->ItemStat[i].ItemStatValue;
6681
6682 sScriptMgr->OnApplyItemModsBefore(this, slot, apply, i, statType, val);
6683 }
6684
6685 if (val == 0)
6686 continue;
6687
6688 switch (statType)
6689 {
6690 case ITEM_MOD_MANA:
6691 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6692 break;
6693 case ITEM_MOD_HEALTH: // modify HP
6694 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6695 break;
6696 case ITEM_MOD_AGILITY: // modify agility
6698 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6699 break;
6700 case ITEM_MOD_STRENGTH: //modify strength
6702 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6703 break;
6704 case ITEM_MOD_INTELLECT: //modify intellect
6706 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6707 break;
6708 case ITEM_MOD_SPIRIT: //modify spirit
6710 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6711 break;
6712 case ITEM_MOD_STAMINA: //modify stamina
6714 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6715 break;
6718 break;
6720 ApplyRatingMod(CR_DODGE, int32(val), apply);
6721 break;
6723 ApplyRatingMod(CR_PARRY, int32(val), apply);
6724 break;
6726 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6727 break;
6729 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6730 break;
6732 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6733 break;
6735 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6736 break;
6738 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6739 break;
6741 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6742 break;
6744 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6745 break;
6748 break;
6751 break;
6754 break;
6757 break;
6760 break;
6763 break;
6765 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6766 break;
6768 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6769 break;
6771 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6772 break;
6774 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6775 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6776 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6777 break;
6779 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6780 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6781 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6782 break;
6787 break;
6793 break;
6795 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6796 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6797 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6798 break;
6800 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6801 break;
6805 break;
6808 break;
6809 // case ITEM_MOD_FERAL_ATTACK_POWER:
6810 // ApplyFeralAPBonus(int32(val), apply);
6811 // break;
6813 ApplyManaRegenBonus(int32(val), apply);
6814 break;
6817 break;
6819 ApplySpellPowerBonus(int32(val), apply);
6820 break;
6822 ApplyHealthRegenBonus(int32(val), apply);
6823 break;
6825 ApplySpellPenetrationBonus(val, apply);
6826 break;
6828 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6829 break;
6833 break;
6834 }
6835 }
6836
6837 // Apply Spell Power from ScalingStatValue if set
6838 if (ssv)
6839 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6840 ApplySpellPowerBonus(spellbonus, apply);
6841
6842 // If set ScalingStatValue armor get it or use item armor
6843 uint32 armor = proto->Armor;
6844 if (ssv)
6845 {
6846 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6847 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6848 armor = ssvarmor;
6849 }
6850 else if (armor && proto->ArmorDamageModifier)
6851 armor -= uint32(proto->ArmorDamageModifier);
6852
6853 if (armor)
6854 {
6855 UnitModifierType modType = TOTAL_VALUE;
6856 if (proto->Class == ITEM_CLASS_ARMOR)
6857 {
6858 switch (proto->SubClass)
6859 {
6865 modType = BASE_VALUE;
6866 break;
6867 }
6868 }
6869 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6870 }
6871
6872 // Add armor bonus from ArmorDamageModifier if > 0
6873 if (proto->ArmorDamageModifier > 0 && sScriptMgr->CanArmorDamageModifier(this))
6874 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6875
6876 if (proto->Block)
6877 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6878
6879 if (proto->HolyRes)
6880 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6881
6882 if (proto->FireRes)
6883 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6884
6885 if (proto->NatureRes)
6886 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6887
6888 if (proto->FrostRes)
6889 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6890
6891 if (proto->ShadowRes)
6892 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6893
6894 if (proto->ArcaneRes)
6895 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6896
6897 uint8 attType = Player::GetAttackBySlot(slot);
6898 if (attType != MAX_ATTACK)
6899 {
6900 _ApplyWeaponDamage(slot, proto, ssv, apply);
6901 }
6902
6903 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6905 {
6906 int32 dpsMod = 0;
6907 int32 feral_bonus = 0;
6908 if (ssv)
6909 {
6910 dpsMod = ssv->getDPSMod(ScalingStatValue);
6911 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6912 }
6913
6914 feral_bonus += proto->getFeralBonus(dpsMod);
6915 sScriptMgr->OnGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6916 if (feral_bonus)
6917 ApplyFeralAPBonus(feral_bonus, apply);
6918 }
6919}
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
std::int32_t int32
Definition Define.h:103
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition ItemTemplate.h:48
@ ITEM_MOD_HIT_MELEE_RATING
Definition ItemTemplate.h:38
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition ItemTemplate.h:44
@ ITEM_MOD_STAMINA
Definition ItemTemplate.h:33
@ ITEM_MOD_HIT_SPELL_RATING
Definition ItemTemplate.h:40
@ ITEM_MOD_SPELL_PENETRATION
Definition ItemTemplate.h:69
@ ITEM_MOD_PARRY_RATING
Definition ItemTemplate.h:36
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition ItemTemplate.h:34
@ ITEM_MOD_HASTE_RANGED_RATING
Definition ItemTemplate.h:51
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition ItemTemplate.h:56
@ ITEM_MOD_EXPERTISE_RATING
Definition ItemTemplate.h:59
@ ITEM_MOD_MANA
Definition ItemTemplate.h:27
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition ItemTemplate.h:61
@ ITEM_MOD_HEALTH
Definition ItemTemplate.h:28
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition ItemTemplate.h:49
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition ItemTemplate.h:46
@ ITEM_MOD_SPIRIT
Definition ItemTemplate.h:32
@ ITEM_MOD_SPELL_POWER
Definition ItemTemplate.h:67
@ ITEM_MOD_HASTE_SPELL_RATING
Definition ItemTemplate.h:52
@ ITEM_MOD_ATTACK_POWER
Definition ItemTemplate.h:60
@ ITEM_MOD_HASTE_RATING
Definition ItemTemplate.h:58
@ ITEM_MOD_HIT_RANGED_RATING
Definition ItemTemplate.h:39
@ ITEM_MOD_CRIT_SPELL_RATING
Definition ItemTemplate.h:43
@ ITEM_MOD_BLOCK_VALUE
Definition ItemTemplate.h:70
@ ITEM_MOD_CRIT_RANGED_RATING
Definition ItemTemplate.h:42
@ ITEM_MOD_CRIT_MELEE_RATING
Definition ItemTemplate.h:41
@ ITEM_MOD_STRENGTH
Definition ItemTemplate.h:30
@ ITEM_MOD_HEALTH_REGEN
Definition ItemTemplate.h:68
@ ITEM_MOD_BLOCK_RATING
Definition ItemTemplate.h:37
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition ItemTemplate.h:66
@ ITEM_MOD_SPELL_HEALING_DONE
Definition ItemTemplate.h:63
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition ItemTemplate.h:47
@ ITEM_MOD_HIT_TAKEN_RATING
Definition ItemTemplate.h:55
@ ITEM_MOD_HASTE_MELEE_RATING
Definition ItemTemplate.h:50
@ ITEM_MOD_MANA_REGENERATION
Definition ItemTemplate.h:65
@ ITEM_MOD_HIT_RATING
Definition ItemTemplate.h:53
@ ITEM_MOD_INTELLECT
Definition ItemTemplate.h:31
@ ITEM_MOD_RESILIENCE_RATING
Definition ItemTemplate.h:57
@ ITEM_MOD_AGILITY
Definition ItemTemplate.h:29
@ ITEM_MOD_DODGE_RATING
Definition ItemTemplate.h:35
@ ITEM_MOD_CRIT_RATING
Definition ItemTemplate.h:54
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition ItemTemplate.h:64
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition ItemTemplate.h:45
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition ItemTemplate.h:393
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition ItemTemplate.h:391
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition ItemTemplate.h:392
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition ItemTemplate.h:396
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition ItemTemplate.h:394
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
#define MAX_ITEM_PROTO_STATS
Definition ItemTemplate.h:616
@ CLASS_DRUID
Definition SharedDefines.h:151
@ STAT_SPIRIT
Definition SharedDefines.h:262
@ STAT_INTELLECT
Definition SharedDefines.h:261
@ STAT_AGILITY
Definition SharedDefines.h:259
@ STAT_STRENGTH
Definition SharedDefines.h:258
@ STAT_STAMINA
Definition SharedDefines.h:260
@ CLASS_CONTEXT_STATS
Definition UnitDefines.h:230
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:147
@ UNIT_MOD_ARMOR
Definition Unit.h:156
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:160
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:163
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:162
@ UNIT_MOD_HEALTH
Definition Unit.h:148
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:158
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:143
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:159
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:144
@ UNIT_MOD_MANA
Definition Unit.h:149
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:145
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:164
@ SHIELD_BLOCK_VALUE
Definition Unit.h:183
UnitModifierType
Definition Unit.h:125
@ BASE_VALUE
Definition Unit.h:126
@ TOTAL_VALUE
Definition Unit.h:128
@ CR_EXPERTISE
Definition Unit.h:240
@ CR_HIT_TAKEN_MELEE
Definition Unit.h:228
@ CR_HASTE_RANGED
Definition Unit.h:235
@ CR_HIT_MELEE
Definition Unit.h:222
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:233
@ CR_ARMOR_PENETRATION
Definition Unit.h:241
@ CR_CRIT_MELEE
Definition Unit.h:225
@ CR_CRIT_RANGED
Definition Unit.h:226
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:230
@ CR_PARRY
Definition Unit.h:220
@ CR_DODGE
Definition Unit.h:219
@ CR_DEFENSE_SKILL
Definition Unit.h:218
@ CR_HASTE_MELEE
Definition Unit.h:234
@ CR_BLOCK
Definition Unit.h:221
@ CR_HASTE_SPELL
Definition Unit.h:236
@ CR_HIT_SPELL
Definition Unit.h:224
@ CR_HIT_TAKEN_RANGED
Definition Unit.h:229
@ CR_CRIT_SPELL
Definition Unit.h:227
@ CR_HIT_RANGED
Definition Unit.h:223
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:231
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition Player.cpp:5280
void ApplySpellPenetrationBonus(int32 amount, bool apply)
Definition StatSystem.cpp:219
void _ApplyWeaponDamage(uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
Definition Player.cpp:6921
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition StatSystem.cpp:913
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1284
void ApplySpellPowerBonus(int32 amount, bool apply)
Definition StatSystem.cpp:167
void ApplyFeralAPBonus(int32 amount, bool apply)
Definition StatSystem.cpp:324
void ApplyHealthRegenBonus(int32 amount, bool apply)
Definition StatSystem.cpp:919
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition Player.cpp:5039
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition Unit.h:1029
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition Unit.cpp:15269
uint8 GetLevel() const
Definition Unit.h:1033
Definition DBCStructure.h:1472
uint32 MaxLevel
Definition DBCStructure.h:1476
uint32 Modifier[10]
Definition DBCStructure.h:1475
int32 StatMod[10]
Definition DBCStructure.h:1474
Definition DBCStructure.h:1480
uint32 getArmorMod(uint32 mask) const
Definition DBCStructure.h:1505
uint32 getDPSMod(uint32 mask) const
Definition DBCStructure.h:1523
uint32 getFeralBonus(uint32 mask) const
Definition DBCStructure.h:1553
uint32 getssdMultiplier(uint32 mask) const
Definition DBCStructure.h:1491
uint32 getSpellBonus(uint32 mask) const
Definition DBCStructure.h:1547

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, CLASS_CONTEXT_STATS, CLASS_DRUID, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, ItemTemplate::FireRes, FLAT_MOD, ItemTemplate::FrostRes, ScalingStatValuesEntry::getArmorMod(), GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, IsClass(), ITEM_CLASS_ARMOR, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_CRIT_TAKEN_MELEE_RATING, ITEM_MOD_CRIT_TAKEN_RANGED_RATING, ITEM_MOD_CRIT_TAKEN_RATING, ITEM_MOD_CRIT_TAKEN_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_MELEE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_HIT_TAKEN_MELEE_RATING, ITEM_MOD_HIT_TAKEN_RANGED_RATING, ITEM_MOD_HIT_TAKEN_RATING, ITEM_MOD_HIT_TAKEN_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, MAX_ATTACK, MAX_ITEM_PROTO_STATS, ScalingStatDistributionEntry::MaxLevel, ScalingStatDistributionEntry::Modifier, ItemTemplate::NatureRes, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, ItemTemplate::ShadowRes, SHIELD_BLOCK_VALUE, sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, ScalingStatDistributionEntry::StatMod, ItemTemplate::StatsCount, ItemTemplate::SubClass, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), and _RemoveAllItemMods().

◆ _ApplyItemMods()

void Player::_ApplyItemMods ( Item item,
uint8  slot,
bool  apply 
)
6592{
6593 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6594 return;
6595
6596 ItemTemplate const* proto = item->GetTemplate();
6597
6598 if (!proto)
6599 return;
6600
6601 // not apply/remove mods for broken item
6602 if (item->IsBroken())
6603 return;
6604
6605 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6606
6607 uint8 attacktype = Player::GetAttackBySlot(slot);
6608
6609 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6610 CorrectMetaGemEnchants(slot, apply);
6611
6612 if (attacktype < MAX_ATTACK)
6613 _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply);
6614
6615 _ApplyItemBonuses(proto, slot, apply);
6616
6617 if (slot == EQUIPMENT_SLOT_RANGED)
6619
6620 ApplyItemEquipSpell(item, apply);
6621 ApplyEnchantment(item, apply);
6622
6623 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6624}
bool HasSocket() const
Definition Item.cpp:1007
bool IsBroken() const
Definition Item.h:257
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:112
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition Player.cpp:11246

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), CorrectMetaGemEnchants(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Object::GetGUID(), Item::GetTemplate(), Item::HasSocket(), INVENTORY_SLOT_BAG_END, Item::IsBroken(), LOG_DEBUG, MAX_ATTACK, and ObjectGuid::ToString().

Referenced by _ApplyAllLevelScaleItemMods(), DestroyItem(), DurabilityPointsLoss(), DurabilityRepair(), EquipItem(), and RemoveItem().

◆ _ApplyWeaponDamage()

void Player::_ApplyWeaponDamage ( uint8  slot,
ItemTemplate const *  proto,
ScalingStatValuesEntry const *  ssv,
bool  apply 
)
6922{
6923 uint32 CustomScalingStatValue = 0;
6924
6925 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6926
6927 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6928
6929 // following part fix disarm issue
6930 // that doesn't apply the scaling after disarmed
6931 if (!ssv)
6932 {
6933 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6934
6935 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6936 uint32 ssd_level = GetLevel();
6937
6938 if (ssd && ssd_level > ssd->MaxLevel)
6939 ssd_level = ssd->MaxLevel;
6940
6941 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6942 }
6943
6944 uint8 attType = Player::GetAttackBySlot(slot);
6945 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6946 {
6947 return;
6948 }
6949
6950 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6951 {
6952 float minDamage = proto->Damage[i].DamageMin;
6953 float maxDamage = proto->Damage[i].DamageMax;
6954
6955 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6956 if (ssv && i == 0) // scaling stats only for first damage
6957 {
6958 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6959 if (extraDPS)
6960 {
6961 float average = extraDPS * proto->Delay / 1000.0f;
6962 float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
6963
6964 minDamage = (1.0f - mod) * average;
6965 maxDamage = (1.0f + mod) * average;
6966 }
6967 }
6968
6969 if (apply)
6970 {
6971 sScriptMgr->OnApplyWeaponDamage(this, slot, proto, minDamage, maxDamage, i);
6972
6973 if (minDamage > 0.f)
6974 {
6975 SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i);
6976 }
6977
6978 if (maxDamage > 0.f)
6979 {
6980 SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i);
6981 }
6982 }
6983 }
6984
6985 if (!apply)
6986 {
6987 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6988 {
6991 }
6992
6993 if (attType == BASE_ATTACK)
6994 {
6997 }
6998 }
6999
7000 if (proto->Delay && !IsInFeralForm())
7001 {
7002 if (slot == EQUIPMENT_SLOT_RANGED)
7003 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
7004 else if (slot == EQUIPMENT_SLOT_MAINHAND)
7005 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
7006 else if (slot == EQUIPMENT_SLOT_OFFHAND)
7007 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
7008 }
7009
7010 // No need to modify any physical damage for ferals as it is calculated from stats only
7011 if (IsInFeralForm())
7012 return;
7013
7014 if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay))
7016}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:695
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:696
@ MINDAMAGE
Definition Unit.h:135
@ MAXDAMAGE
Definition Unit.h:136
#define BASE_ATTACK_TIME
Definition Unit.h:41
@ OFF_ATTACK
Definition Unit.h:210
@ BASE_ATTACK
Definition Unit.h:209
#define BASE_MAXDAMAGE
Definition Unit.h:40
#define BASE_MINDAMAGE
Definition Unit.h:39
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition Unit.cpp:15518
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition Unit.h:1146
bool IsInFeralForm() const
Definition Unit.h:1873
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition Unit.h:879

References BASE_ATTACK, BASE_ATTACK_TIME, BASE_MAXDAMAGE, BASE_MINDAMAGE, Unit::CanModifyStats(), Unit::CanUseAttackType(), ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, ItemTemplate::Delay, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), Unit::GetLevel(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), ScalingStatValuesEntry::IsTwoHand(), MAX_ITEM_PROTO_DAMAGES, MAXDAMAGE, ScalingStatDistributionEntry::MaxLevel, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, Unit::SetAttackTime(), Unit::SetBaseWeaponDamage(), sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyItemBonuses(), AuraEffect::HandleAuraModDisarm(), and AuraEffect::HandleAuraModShapeshift().

◆ _ApplyWeaponDependentAuraCritMod()

void Player::_ApplyWeaponDependentAuraCritMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7044{
7045 // don't apply mod if item is broken or cannot be used
7046 if (item->IsBroken() || !CanUseAttackType(attackType))
7047 return;
7048
7049 // generic not weapon specific case processes in aura code
7050 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7051 return;
7052
7053 if (!sScriptMgr->CanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
7054 return;
7055
7057 switch (attackType)
7058 {
7059 case BASE_ATTACK:
7060 mod = CRIT_PERCENTAGE;
7061 break;
7062 case OFF_ATTACK:
7064 break;
7065 case RANGED_ATTACK:
7067 break;
7068 default:
7069 return;
7070 }
7071
7072 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7073 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
7074}
BaseModGroup
Definition Unit.h:179
@ OFFHAND_CRIT_PERCENTAGE
Definition Unit.h:182
@ CRIT_PERCENTAGE
Definition Unit.h:180
@ RANGED_CRIT_PERCENTAGE
Definition Unit.h:181
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition Item.cpp:884

References BASE_ATTACK, BASEMOD_END, Unit::CanUseAttackType(), CRIT_PERCENTAGE, SpellInfo::EquippedItemClass, FLAT_MOD, AuraEffect::GetAmount(), AuraEffect::GetSpellInfo(), HandleBaseModValue(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, and sScriptMgr.

Referenced by _ApplyWeaponDependentAuraMods(), and AuraEffect::HandleAuraModWeaponCritPercent().

◆ _ApplyWeaponDependentAuraDamageMod()

void Player::_ApplyWeaponDependentAuraDamageMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7077{
7078 // don't apply mod if item is broken or cannot be used
7079 if (item->IsBroken() || !CanUseAttackType(attackType))
7080 return;
7081
7082 // ignore spell mods for not wands
7083 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
7084 return;
7085
7086 // generic not weapon specific case processes in aura code
7087 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7088 return;
7089
7090 UnitMods unitMod = UNIT_MOD_END;
7091 switch (attackType)
7092 {
7093 case BASE_ATTACK:
7094 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
7095 break;
7096 case OFF_ATTACK:
7097 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
7098 break;
7099 case RANGED_ATTACK:
7100 unitMod = UNIT_MOD_DAMAGE_RANGED;
7101 break;
7102 default:
7103 return;
7104 }
7105
7106 UnitModifierType unitModType = TOTAL_VALUE;
7107 switch (aura->GetAuraType())
7108 {
7110 unitModType = TOTAL_VALUE;
7111 break;
7113 unitModType = TOTAL_PCT;
7114 break;
7115 default:
7116 return;
7117 }
7118
7119 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7120 {
7121 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
7122 if (unitModType == TOTAL_VALUE)
7123 {
7124 if (aura->GetAmount() > 0)
7125 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
7126 else
7127 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
7128 }
7129 }
7130}
#define CLASSMASK_WAND_USERS
Definition SharedDefines.h:174
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:297
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
UnitMods
Definition Unit.h:142
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:166
@ UNIT_MOD_END
Definition Unit.h:168
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:165
@ TOTAL_PCT
Definition Unit.h:129
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition UpdateFields.h:361
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:806
uint32 getClassMask() const
Definition Unit.h:811

References Object::ApplyModUInt32Value(), BASE_ATTACK, Unit::CanUseAttackType(), CLASSMASK_WAND_USERS, SpellInfo::EquippedItemClass, AuraEffect::GetAmount(), AuraEffect::GetAuraType(), Unit::getClassMask(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), Unit::HandleStatModifier(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, RANGED_ATTACK, SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, and UNIT_MOD_END.

Referenced by _ApplyWeaponDependentAuraMods(), AuraEffect::HandleModDamageDone(), and AuraEffect::HandleModDamagePercentDone().

◆ _ApplyWeaponDependentAuraMods()

void Player::_ApplyWeaponDependentAuraMods ( Item item,
WeaponAttackType  attackType,
bool  apply 
)
7029{
7031 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
7032 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
7033
7035 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
7036 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7037
7039 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
7040 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7041}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition Player.cpp:7076
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition Player.cpp:7043
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1358
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:652

References _ApplyWeaponDependentAuraCritMod(), _ApplyWeaponDependentAuraDamageMod(), Unit::GetAuraEffectsByType(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and AuraEffect::HandleAuraModDisarm().

◆ _LoadActions()

void Player::_LoadActions ( PreparedQueryResult  result)
protected
5674{
5675 m_actionButtons.clear();
5676
5677 if (result)
5678 {
5679 do
5680 {
5681 Field* fields = result->Fetch();
5682 uint8 button = fields[0].Get<uint8>();
5683 uint32 action = fields[1].Get<uint32>();
5684 uint8 type = fields[2].Get<uint8>();
5685
5686 if (ActionButton* ab = addActionButton(button, action, type))
5687 ab->uState = ACTIONBUTTON_UNCHANGED;
5688 else
5689 {
5690
5691 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db. player: {}, guid: {}, button: {}, action: {}, type: {}", GetName(), GetGUID().GetCounter(), button, action, type);
5692
5693 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5694 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5695 }
5696 } while (result->NextRow());
5697 }
5698}
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
@ ACTIONBUTTON_UNCHANGED
Definition Player.h:221
@ ACTIONBUTTON_DELETED
Definition Player.h:224
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition Player.cpp:5643
ActionButtonList m_actionButtons
Definition Player.h:2830
std::string const & GetName() const
Definition Object.h:463
Definition Player.h:258

References ACTIONBUTTON_DELETED, ACTIONBUTTON_UNCHANGED, addActionButton(), Field::Get(), Object::GetGUID(), WorldObject::GetName(), LOG_ERROR, and m_actionButtons.

Referenced by WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and LoadFromDB().

◆ _LoadArenaTeamInfo()

void Player::_LoadArenaTeamInfo ( )
protected
4797{
4799
4800 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4801 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4802 {
4803 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4804 if (!arenaTeam)
4805 {
4806 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4807 continue;
4808 }
4809 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4810 if (!member)
4811 {
4812 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4813 continue;
4814 }
4815 uint8 slot = itr.second;
4816
4817 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4818 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4819 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4824 }
4825}
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:67
#define MAX_ARENA_SLOT
Definition ArenaTeam.h:134
@ ARENA_TEAM_GAMES_WEEK
Definition ArenaTeam.h:77
@ ARENA_TEAM_TYPE
Definition ArenaTeam.h:75
@ ARENA_TEAM_ID
Definition ArenaTeam.h:74
@ ARENA_TEAM_END
Definition ArenaTeam.h:81
@ ARENA_TEAM_PERSONAL_RATING
Definition ArenaTeam.h:80
@ ARENA_TEAM_MEMBER
Definition ArenaTeam.h:76
@ ARENA_TEAM_WINS_SEASON
Definition ArenaTeam.h:79
@ ARENA_TEAM_GAMES_SEASON
Definition ArenaTeam.h:78
#define sCharacterCache
Definition CharacterCache.h:83
@ PLAYER_FIELD_ARENA_TEAM_INFO_1_1
Definition UpdateFields.h:381
Definition ArenaTeam.h:137
ObjectGuid GetCaptain() const
Definition ArenaTeam.h:153
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition ArenaTeam.cpp:1012
uint32 GetType() const
Definition ArenaTeam.h:149
uint32 * m_uint32Values
Definition Object.h:253
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition Player.cpp:16232
Definition ArenaTeam.h:108
uint16 PersonalRating
Definition ArenaTeam.h:116
uint16 SeasonWins
Definition ArenaTeam.h:115
uint16 WeekGames
Definition ArenaTeam.h:112
uint16 SeasonGames
Definition ArenaTeam.h:114

References ARENA_TEAM_END, ARENA_TEAM_GAMES_SEASON, ARENA_TEAM_GAMES_WEEK, ARENA_TEAM_ID, ARENA_TEAM_MEMBER, ARENA_TEAM_PERSONAL_RATING, ARENA_TEAM_TYPE, ARENA_TEAM_WINS_SEASON, ArenaTeam::ArenaSlotByType, ArenaTeam::GetCaptain(), Object::GetGUID(), ArenaTeam::GetMember(), ArenaTeam::GetType(), LOG_ERROR, Object::m_uint32Values, MAX_ARENA_SLOT, ArenaTeamMember::PersonalRating, PLAYER_FIELD_ARENA_TEAM_INFO_1_1, sArenaTeamMgr, sCharacterCache, ArenaTeamMember::SeasonGames, ArenaTeamMember::SeasonWins, SetArenaTeamInfoField(), and ArenaTeamMember::WeekGames.

Referenced by LoadFromDB().

◆ _LoadAuras()

void Player::_LoadAuras ( PreparedQueryResult  result,
uint32  timediff 
)
protected
5701{
5702 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5703
5704 /* 0 1 2 3 4 5 6 7 8 9 10 11
5705 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5706 12 13 14
5707 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5708 */
5709
5710 if (result)
5711 {
5712 do
5713 {
5714 Field* fields = result->Fetch();
5715 int32 damage[3];
5716 int32 baseDamage[3];
5717 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5718 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5719 uint32 spellid = fields[2].Get<uint32>();
5720 uint8 effmask = fields[3].Get<uint8>();
5721 uint8 recalculatemask = fields[4].Get<uint8>();
5722 uint8 stackcount = fields[5].Get<uint8>();
5723 damage[0] = fields[6].Get<int32>();
5724 damage[1] = fields[7].Get<int32>();
5725 damage[2] = fields[8].Get<int32>();
5726 baseDamage[0] = fields[9].Get<int32>();
5727 baseDamage[1] = fields[10].Get<int32>();
5728 baseDamage[2] = fields[11].Get<int32>();
5729 int32 maxduration = fields[12].Get<int32>();
5730 int32 remaintime = fields[13].Get<int32>();
5731 uint8 remaincharges = fields[14].Get<uint8>();
5732
5733 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5734 if (!spellInfo)
5735 {
5736 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5737 continue;
5738 }
5739
5740 // Xinef: leave this
5741 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5742 {
5743 SetMountBlockId(spellInfo->Id);
5744 continue;
5745 }
5746
5747 // negative effects should continue counting down after logout
5748 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5749 {
5750 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5751 continue;
5752
5753 remaintime -= timediff * IN_MILLISECONDS;
5754 }
5755
5756 // prevent wrong values of remaincharges
5757 if (spellInfo->ProcCharges)
5758 {
5759 // we have no control over the order of applying auras and modifiers allow auras
5760 // to have more charges than value in SpellInfo
5761 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5762 remaincharges = spellInfo->ProcCharges;
5763 }
5764 else
5765 remaincharges = 0;
5766
5767 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5768 {
5769 if (!aura->CanBeSaved())
5770 {
5771 aura->Remove();
5772 continue;
5773 }
5774
5775 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5776 aura->ApplyForTargets();
5777 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5778 }
5779 } while (result->NextRow());
5780 }
5781}
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition SharedDefines.h:532
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:352
Definition ObjectGuid.h:118
void SetMountBlockId(uint32 mount)
Definition Player.h:2613

References Field::Get(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, SetMountBlockId(), SPELL_ATTR4_AURA_EXPIRES_OFFLINE, SPELL_AURA_MOUNTED, sSpellMgr, Position::ToString(), and Aura::TryCreate().

Referenced by LoadFromDB().

◆ _LoadBrewOfTheMonth()

void Player::_LoadBrewOfTheMonth ( PreparedQueryResult  result)
protected
15819{
15820 uint32 lastEventId = 0;
15821 if (result)
15822 {
15823 Field* fields = result->Fetch();
15824 lastEventId = fields[0].Get<uint32>();
15825 }
15826
15827 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15828 uint16 eventId = month;
15829 if (eventId < 9)
15830 eventId += 3;
15831 else
15832 eventId -= 9;
15833
15834 // Brew of the Month October (first in list)
15835 eventId += 34;
15836
15837 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15838 {
15839 // Send Mail
15840 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15841 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15842 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15843 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15844
15845 // Update Event Id
15847 stmt->SetData(0, GetGUID().GetCounter());
15848 stmt->SetData(1, uint32(eventId));
15849 trans->Append(stmt);
15850
15851 CharacterDatabase.CommitTransaction(trans);
15852 }
15853}
@ CHAR_REP_BREW_OF_THE_MONTH
Definition CharacterDatabase.h:103
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
bool IsEventActive(uint16 event_id)
Definition GameEventMgr.cpp:1948
@ MAIL_CREATURE
Definition Mail.h:39
Definition Mail.h:119
Definition Mail.h:105
Definition Mail.h:83
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:13956
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
AC_COMMON_API uint32 GetMonth(Seconds time=0s)
Definition Timer.cpp:424

References CHAR_REP_BREW_OF_THE_MONTH, CharacterDatabase, Field::Get(), Object::GetGUID(), Acore::Time::GetMonth(), HasAchieved(), IsEventActive(), MAIL_CREATURE, MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by LoadFromDB().

◆ _LoadCharacterSettings()

void Player::_LoadCharacterSettings ( PreparedQueryResult  result)
protected
27{
28 m_charSettingsMap.clear();
29
30 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
31 {
32 return;
33 }
34
35 if (result)
36 {
37 do
38 {
39 Field* fields = result->Fetch();
40
41 std::string source = fields[0].Get<std::string>();
42 std::string data = fields[1].Get<std::string>();
43
44 std::vector<std::string_view> tokens = Acore::Tokenize(data, ' ', false);
45
46 PlayerSettingVector setting;
47 setting.resize(tokens.size());
48
49 uint32 count = 0;
50
51 for (auto& token : tokens)
52 {
53 if (token.empty())
54 {
55 continue;
56 }
57
58 PlayerSetting set;
59 set.value = Acore::StringTo<uint32>(token).value();
60 setting[count] = set;
61 ++count;
62 }
63
64 m_charSettingsMap[source] = setting;
65
66 } while (result->NextRow());
67 }
68}
@ CONFIG_PLAYER_SETTINGS_ENABLED
Definition IWorld.h:171
std::vector< PlayerSetting > PlayerSettingVector
Definition PlayerSettings.h:48
PlayerSettingMap m_charSettingsMap
Definition Player.h:3015
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Tokenize.cpp:20
Definition PlayerSettings.h:39
uint32 value
Definition PlayerSettings.h:40

References CONFIG_PLAYER_SETTINGS_ENABLED, Field::Get(), m_charSettingsMap, sWorld, Acore::Tokenize(), and PlayerSetting::value.

Referenced by LoadFromDB().

◆ _LoadDailyQuestStatus()

void Player::_LoadDailyQuestStatus ( PreparedQueryResult  result)
protected
6351{
6352 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6353 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6354
6355 m_DFQuests.clear();
6356
6357 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6358
6359 if (result)
6360 {
6361 uint32 quest_daily_idx = 0;
6362
6363 do
6364 {
6365 Field* fields = result->Fetch();
6366 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6367 {
6368 if (qQuest->IsDFQuest())
6369 {
6370 m_DFQuests.insert(qQuest->GetQuestId());
6371 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6372 continue;
6373 }
6374 }
6375
6376 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6377 {
6378 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6379 break;
6380 }
6381
6382 uint32 quest_id = fields[0].Get<uint32>();
6383
6384 // save _any_ from daily quest times (it must be after last reset anyway)
6385 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6386
6387 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6388 if (!quest)
6389 continue;
6390
6391 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6392 ++quest_daily_idx;
6393
6394 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6395 } while (result->NextRow());
6396 }
6397
6398 m_DailyQuestChanged = false;
6399}
#define PLAYER_MAX_DAILY_QUESTS
Definition Player.h:71
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition UpdateFields.h:385
DFQuestsDoneList m_DFQuests
Definition Player.h:2418
Definition QuestDef.h:210
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21388

References Field::Get(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4786{
4787 if (!result)
4788 return;
4789
4790 delete m_declinedname;
4792 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4793 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4794}
#define MAX_DECLINED_NAME_CASES
Definition Unit.h:528
Definition Unit.h:531
std::string name[MAX_DECLINED_NAME_CASES]
Definition Unit.h:532

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4859{
4860 if (!result)
4861 return;
4862
4863 Field* fields = result->Fetch();
4864 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4865 fields[0].Get<float>(), // X
4866 fields[1].Get<float>(), // Y
4867 fields[2].Get<float>(), // Z
4868 fields[3].Get<float>()); // Orientation
4869
4870 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4871 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4872 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4873}
EntryPointData m_entryPointData
Definition Player.h:2695
Definition Position.h:250
uint32 mountSpell
Definition Player.h:1060
std::array< uint32, 2 > taxiPath
Definition Player.h:1061
WorldLocation joinPos
Definition Player.h:1062

References Field::Get(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, and EntryPointData::taxiPath.

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4828{
4829 // SetQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '{}' ORDER BY setindex", m_guid.GetCounter());
4830 if (!result)
4831 return;
4832
4833 uint32 count = 0;
4834 do
4835 {
4836 Field* fields = result->Fetch();
4837 EquipmentSet eqSet;
4838
4839 eqSet.Guid = fields[0].Get<uint64>();
4840 uint8 index = fields[1].Get<uint8>();
4841 eqSet.Name = fields[2].Get<std::string>();
4842 eqSet.IconName = fields[3].Get<std::string>();
4843 eqSet.IgnoreMask = fields[4].Get<uint32>();
4845
4846 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4847 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4848
4849 m_EquipmentSets[index] = eqSet;
4850
4851 ++count;
4852
4853 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4854 break;
4855 } while (result->NextRow());
4856}
std::uint64_t uint64
Definition Define.h:106
@ EQUIPMENT_SET_UNCHANGED
Definition Player.h:747
#define MAX_EQUIPMENT_SET_INDEX
Definition Player.h:765
@ EQUIPMENT_SLOT_END
Definition Player.h:699
EquipmentSets m_EquipmentSets
Definition Player.h:2923
Definition Player.h:754
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition Player.h:761
std::string Name
Definition Player.h:758
std::string IconName
Definition Player.h:759
EquipmentSetUpdateState state
Definition Player.h:762
uint64 Guid
Definition Player.h:757
uint32 IgnoreMask
Definition Player.h:760

References EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, Field::Get(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, MAX_EQUIPMENT_SET_INDEX, EquipmentSet::Name, and EquipmentSet::state.

Referenced by LoadFromDB().

◆ _LoadFriendList()

void Player::_LoadFriendList ( PreparedQueryResult  result)
protected

◆ _LoadGlyphAuras()

void Player::_LoadGlyphAuras ( )
protected
5784{
5785 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5786 {
5787 if (uint32 glyph = GetGlyph(i))
5788 {
5789 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5790 {
5791 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5792 {
5793 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5794 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5795 {
5796 if (!spellInfo->Stances)
5798 continue;
5799 }
5800 else
5801 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5802 }
5803 else
5804 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5805 }
5806 else
5807 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5808
5809 // On any error remove glyph
5810 SetGlyph(i, 0, true);
5811 }
5812 }
5813}
DBCStorage< GlyphSlotEntry > sGlyphSlotStore(GlyphSlotfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
Definition SpellDefines.h:145
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
Definition SpellDefines.h:144
uint32 GetGlyph(uint8 slot) const
Definition Player.h:1774
uint32 GetGlyphSlot(uint8 slot) const
Definition Player.h:1765
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition Player.h:1766
std::string m_name
Definition Object.h:638
Definition DBCStructure.h:1020
Definition DBCStructure.h:1028

References Unit::CastSpell(), GetGlyph(), GetGlyphSlot(), LOG_ERROR, WorldObject::m_name, MAX_GLYPH_SLOT_INDEX, SetGlyph(), sGlyphPropertiesStore, sGlyphSlotStore, sSpellMgr, SpellInfo::Stances, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, and TRIGGERED_IGNORE_SHAPESHIFT.

Referenced by LoadFromDB().

◆ _LoadGlyphs()

void Player::_LoadGlyphs ( PreparedQueryResult  result)
protected
14995{
14996 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
14997 if (!result)
14998 return;
14999
15000 do
15001 {
15002 Field* fields = result->Fetch();
15003
15004 uint8 spec = fields[0].Get<uint8>();
15005 if (spec >= m_specsCount)
15006 continue;
15007
15008 m_Glyphs[spec][0] = fields[1].Get<uint16>();
15009 m_Glyphs[spec][1] = fields[2].Get<uint16>();
15010 m_Glyphs[spec][2] = fields[3].Get<uint16>();
15011 m_Glyphs[spec][3] = fields[4].Get<uint16>();
15012 m_Glyphs[spec][4] = fields[5].Get<uint16>();
15013 m_Glyphs[spec][5] = fields[6].Get<uint16>();
15014 } while (result->NextRow());
15015}

References Field::Get(), m_Glyphs, and m_specsCount.

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6482{
6483 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6484 {
6485 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6486 {
6487 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6488 {
6489 if (group->IsLeader(GetGUID()))
6490 {
6492 }
6493
6494 uint8 subgroup = group->GetMemberGroup(GetGUID());
6495 SetGroup(group, subgroup);
6496
6497 // the group leader may change the instance difficulty while the player is offline
6498 SetDungeonDifficulty(group->GetDungeonDifficulty());
6499 SetRaidDifficulty(group->GetRaidDifficulty());
6500 }
6501 }
6502 }
6503
6504 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6506}
#define sGroupMgr
Definition GroupMgr.h:51
#define MAX_RAID_SUBGROUPS
Definition Group.h:45
@ PLAYER_FLAGS_GROUP_LEADER
Definition Player.h:479
Definition Group.h:169
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1126
void RemovePlayerFlag(PlayerFlags flags)
Definition Player.h:1127
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1931
void SetGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:11600
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1932
Group * GetGroup()
Definition Player.h:2476

References GetGroup(), Object::GetGUID(), MAX_RAID_SUBGROUPS, PLAYER_FLAGS_GROUP_LEADER, RemovePlayerFlag(), sCharacterCache, SetDungeonDifficulty(), SetGroup(), SetPlayerFlag(), SetRaidDifficulty(), and sGroupMgr.

Referenced by LoadFromDB().

◆ _LoadHomeBind()

bool Player::_LoadHomeBind ( PreparedQueryResult  result)
protected
6989{
6990 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
6991 if (!info)
6992 {
6993 LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName());
6994 return false;
6995 }
6996
6997 bool ok = false;
6998 // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?
6999 if (result)
7000 {
7001 Field* fields = result->Fetch();
7002
7003 m_homebindMapId = fields[0].Get<uint16>();
7004 m_homebindAreaId = fields[1].Get<uint16>();
7005 m_homebindX = fields[2].Get<float>();
7006 m_homebindY = fields[3].Get<float>();
7007 m_homebindZ = fields[4].Get<float>();
7008
7009 MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId);
7010
7011 // accept saved data only for valid position (and non instanceable), and accessable
7013 !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion())
7014 ok = true;
7015 else
7016 {
7018 stmt->SetData(0, GetGUID().GetCounter());
7019 CharacterDatabase.Execute(stmt);
7020 }
7021 }
7022
7023 if (!ok)
7024 {
7025 m_homebindMapId = info->mapId;
7026 m_homebindAreaId = info->areaId;
7027 m_homebindX = info->positionX;
7028 m_homebindY = info->positionY;
7029 m_homebindZ = info->positionZ;
7030
7032 stmt->SetData(0, GetGUID().GetCounter());
7033 stmt->SetData(1, m_homebindMapId);
7034 stmt->SetData(2, m_homebindAreaId);
7035 stmt->SetData (3, m_homebindX);
7036 stmt->SetData (4, m_homebindY);
7037 stmt->SetData (5, m_homebindZ);
7038 CharacterDatabase.Execute(stmt);
7039 }
7040
7041 LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}",
7043 return true;
7044}
@ CHAR_INS_PLAYER_HOMEBIND
Definition CharacterDatabase.h:240
@ CHAR_DEL_PLAYER_HOMEBIND
Definition CharacterDatabase.h:242
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:89
LowType GetCounter() const
Definition ObjectGuid.h:145
uint8 getClass() const
Definition Unit.h:809
uint8 getRace(bool original=false) const
Definition Unit.cpp:21072
uint8 Expansion() const
Definition WorldSession.h:387
Definition DBCStructure.h:1324
Definition Player.h:340
float positionX
Definition Player.h:346
uint32 areaId
Definition Player.h:345
float positionY
Definition Player.h:347
float positionZ
Definition Player.h:348
uint32 mapId
Definition Player.h:344

References PlayerInfo::areaId, CHAR_DEL_PLAYER_HOMEBIND, CHAR_INS_PLAYER_HOMEBIND, CharacterDatabase, WorldSession::Expansion(), Field::Get(), Unit::getClass(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSession(), MapMgr::IsValidMapCoord(), LOG_DEBUG, LOG_ERROR, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15807{
15808 if (!result)
15809 return;
15810
15811 do
15812 {
15813 Field* fields = result->Fetch();
15814 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15815 } while (result->NextRow());
15816}
InstanceTimeMap _instanceResetTimes
Definition Player.h:2995

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

void Player::_LoadInventory ( PreparedQueryResult  result,
uint32  timeDiff 
)
protected
5836{
5837 //QueryResult* result = CharacterDatabase.Query("SELECT data, text, bag, slot, item, item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '{}' ORDER BY bag, slot", GetGUID().GetCounter());
5838 //NOTE: the "order by `bag`" is important because it makes sure
5839 //the bagMap is filled before items in the bags are loaded
5840 //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?)
5841 //expected to be equipped before offhand items (TODO: fixme)
5842
5843 if (result)
5844 {
5845 uint32 zoneId = GetZoneId();
5846
5847 std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags
5848 std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags
5849 std::list<Item*> problematicItems;
5850 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
5851
5852 // Prevent items from being added to the queue while loading
5854 do
5855 {
5856 Field* fields = result->Fetch();
5857 if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
5858 {
5859 ObjectGuid::LowType bagGuid = fields[11].Get<uint32>();
5860 uint8 slot = fields[12].Get<uint8>();
5861
5862 uint8 err = EQUIP_ERR_OK;
5863 // Item is not in bag
5864 if (!bagGuid)
5865 {
5866 item->SetContainer(nullptr);
5867 item->SetSlot(slot);
5868
5870 {
5871 ItemPosCountVec dest;
5872 err = CanStoreItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false);
5873 if (err == EQUIP_ERR_OK)
5874 item = StoreItem(dest, item, true);
5875 }
5876 else if (IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
5877 {
5878 uint16 dest;
5879 if (sScriptMgr->CheckItemInSlotAtLoadInventory(this, item, slot, err, dest))
5880 err = CanEquipItem(slot, dest, item, false, false);
5881 if (err == EQUIP_ERR_OK)
5882 QuickEquipItem(dest, item);
5883 }
5884 else if (IsBankPos(INVENTORY_SLOT_BAG_0, slot))
5885 {
5886 ItemPosCountVec dest;
5887 err = CanBankItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false, false);
5888 if (err == EQUIP_ERR_OK)
5889 item = BankItem(dest, item, true);
5890 }
5891
5892 // Remember bags that may contain items in them
5893 if (err == EQUIP_ERR_OK)
5894 {
5895 if (IsBagPos(item->GetPos()))
5896 if (Bag* pBag = item->ToBag())
5897 bagMap[item->GetGUID().GetCounter()] = pBag;
5898 }
5899 else if (IsBagPos(item->GetPos()))
5900 if (item->IsBag())
5901 invalidBagMap[item->GetGUID().GetCounter()] = item;
5902 }
5903 else
5904 {
5905 item->SetSlot(NULL_SLOT);
5906 // Item is in the bag, find the bag
5907 std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid);
5908 if (itr != bagMap.end())
5909 {
5910 ItemPosCountVec dest;
5911 err = CanStoreItem(itr->second->GetSlot(), slot, dest, item);
5912 if (err == EQUIP_ERR_OK)
5913 item = StoreItem(dest, item, true);
5914 }
5915 else if (invalidBagMap.find(bagGuid) != invalidBagMap.end())
5916 {
5917 std::map<ObjectGuid::LowType, Item*>::iterator iterator = invalidBagMap.find(bagGuid);
5918 if (std::find(problematicItems.begin(), problematicItems.end(), iterator->second) != problematicItems.end())
5919 {
5921 }
5922 }
5923 else
5924 {
5925 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which doesnt have a valid bag (Bag GUID: {}, slot: {}). Possible cheat?",
5926 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot);
5927 item->DeleteFromInventoryDB(trans);
5928 delete item;
5929 continue;
5930 }
5931 }
5932
5933 // Item's state may have changed after storing
5934 if (err == EQUIP_ERR_OK)
5935 item->SetState(ITEM_UNCHANGED, this);
5936 else
5937 {
5938 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which can't be loaded into inventory (Bag GUID: {}, slot: {}) by reason {}. Item will be sent by mail.",
5939 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot, err);
5940 item->DeleteFromInventoryDB(trans);
5941 problematicItems.push_back(item);
5942 }
5943 }
5944 } while (result->NextRow());
5945
5947
5948 // Send problematic items by mail
5949 while (!problematicItems.empty())
5950 {
5951 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
5952
5953 MailDraft draft(subject, "There were problems with equipping item(s).");
5954 for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
5955 {
5956 draft.AddItem(problematicItems.front());
5957 problematicItems.pop_front();
5958 }
5959 draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
5960 }
5961 CharacterDatabase.CommitTransaction(trans);
5962 }
5963 //if (IsAlive())
5965}
@ EQUIP_ERR_OK
Definition Item.h:47
@ EQUIP_ERR_INT_BAG_ERROR
Definition Item.h:87
@ ITEM_UNCHANGED
Definition Item.h:209
@ NULL_SLOT
Definition Item.h:41
@ LANG_NOT_EQUIPPED_ITEM
Definition Language.h:672
#define MAX_MAIL_ITEMS
Definition Mail.h:33
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
Definition Mail.h:49
@ MAIL_STATIONERY_GM
Definition Mail.h:59
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:776
#define INVENTORY_SLOT_BAG_0
Definition Player.h:675
Definition Bag.h:28
Bag * ToBag()
Definition Item.h:250
uint32 LowType
Definition ObjectGuid.h:122
static bool IsEquipmentPos(uint16 pos)
Definition Player.h:1275
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition PlayerStorage.cpp:1805
void QuickEquipItem(uint16 pos, Item *pItem)
Definition PlayerStorage.cpp:2835
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
Definition Player.h:1344
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
Definition Player.h:1295
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Definition PlayerStorage.cpp:2574
static bool IsInventoryPos(uint16 pos)
Definition Player.h:1273
Item * _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
Definition PlayerStorage.cpp:5967
static bool IsBagPos(uint16 pos)
Definition PlayerStorage.cpp:590
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition PlayerStorage.cpp:2032
static bool IsBankPos(uint16 pos)
Definition Player.h:1278
uint32 GetZoneId() const
Definition Object.cpp:3159
std::string GetAcoreString(uint32 entry) const
Definition WorldSession.cpp:805

References _ApplyAllItemMods(), _LoadItem(), MailDraft::AddItem(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CharacterDatabase, EQUIP_ERR_INT_BAG_ERROR, EQUIP_ERR_OK, Field::Get(), WorldSession::GetAcoreString(), Object::GetGUID(), WorldObject::GetName(), GetSession(), WorldObject::GetZoneId(), INVENTORY_SLOT_BAG_0, IsBagPos(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), ITEM_UNCHANGED, LANG_NOT_EQUIPPED_ITEM, LOG_ERROR, m_itemUpdateQueueBlocked, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, NULL_SLOT, QuickEquipItem(), MailDraft::SendMailTo(), sScriptMgr, StoreItem(), Item::ToBag(), ObjectGuid::ToString(), and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadItem()

Item * Player::_LoadItem ( CharacterDatabaseTransaction  trans,
uint32  zoneId,
uint32  timeDiff,
Field fields 
)
private
5968{
5969 Item* item = nullptr;
5970 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5971 uint32 itemEntry = fields[14].Get<uint32>();
5972 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5973 {
5974 bool remove = false;
5975 item = NewItemOrBag(proto);
5976 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5977 {
5978 CharacterDatabasePreparedStatement* stmt = nullptr;
5979
5980 // Do not allow to have item limited to another map/zone in alive state
5981 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
5982 {
5983 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
5984 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
5985 remove = true;
5986 }
5987 // "Conjured items disappear if you are logged out for more than 15 minutes"
5988 else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED))
5989 {
5990 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
5991 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
5992 remove = true;
5993 }
5994 else if (item->IsRefundable())
5995 {
5996 if (item->GetPlayedTime() > (2 * HOUR))
5997 {
5998 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
5999 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6000 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6001 stmt->SetData(0, item->GetGUID().GetCounter());
6002 trans->Append(stmt);
6003
6005 }
6006 else
6007 {
6008 // xinef: sync query
6009 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6010 stmt->SetData(0, item->GetGUID().GetCounter());
6011 stmt->SetData(1, GetGUID().GetCounter());
6012 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6013 {
6014 item->SetRefundRecipient((*result)[0].Get<uint32>());
6015 item->SetPaidMoney((*result)[1].Get<uint32>());
6016 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6017 AddRefundReference(item->GetGUID());
6018 }
6019 else
6020 {
6021 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6022 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6024 }
6025 }
6026 }
6027 else if (item->IsBOPTradable())
6028 {
6029 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6030 stmt->SetData(0, item->GetGUID().GetCounter());
6031
6032 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6033 {
6034 AllowedLooterSet looters;
6035 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6036 {
6037 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6038 {
6039 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6040 }
6041 else
6042 {
6043 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6044 }
6045 }
6046
6047 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6048 {
6049 item->SetSoulboundTradeable(looters);
6050 AddTradeableItem(item);
6051 }
6052 else
6053 item->ClearSoulboundTradeable(this);
6054 }
6055 else
6056 {
6057 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with ITEM_FIELD_FLAG_BOP_TRADEABLE flag, but without data in item_soulbound_trade_data. Removing flag.",
6058 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6060 }
6061 }
6062 else if (proto->HolidayId)
6063 {
6064 remove = true;
6065 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6066 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6067 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6068 {
6069 if (uint32(events[*itr].holiday_id) == proto->HolidayId)
6070 {
6071 remove = false;
6072 break;
6073 }
6074 }
6075 }
6076 }
6077 else
6078 {
6079 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6080 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6081 remove = true;
6082 }
6083 // Remove item from inventory if necessary
6084 if (remove)
6085 {
6086 Item::DeleteFromInventoryDB(trans, itemGuid);
6087 item->FSetState(ITEM_REMOVED);
6088 item->SaveToDB(trans); // it also deletes item object!
6089 item = nullptr;
6090 }
6091 }
6092 else
6093 {
6094 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6095 GetGUID().ToString(), GetName(), itemEntry);
6096 Item::DeleteFromInventoryDB(trans, itemGuid);
6097 Item::DeleteFromDB(trans, itemGuid);
6098 }
6099 return item;
6100}
Item * NewItemOrBag(ItemTemplate const *proto)
Definition Bag.h:67
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition CharacterDatabase.h:374
@ CHAR_SEL_ITEM_BOP_TRADE
Definition CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition CharacterDatabase.h:119
constexpr auto HOUR
Definition Common.h:48
constexpr auto MINUTE
Definition Common.h:47
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
#define sGameEventMgr
Definition GameEventMgr.h:188
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition ItemTemplate.h:121
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition ItemTemplate.h:117
@ ITEM_FLAG_CONJURED
Definition ItemTemplate.h:148
@ ITEM_REMOVED
Definition Item.h:212
#define LOG_WARN(filterType__,...)
Definition Log.h:161
GuidSet AllowedLooterSet
Definition LootMgr.h:151
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:24
@ ITEM_FIELD_FLAGS
Definition UpdateFields.h:42
events
Definition boss_sartura.cpp:43
std::vector< GameEventData > GameEventDataMap
Definition GameEventMgr.h:107
std::set< uint16 > ActiveEvents
Definition GameEventMgr.h:106
uint32 GetPlayedTime()
Definition Item.cpp:1246
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:532
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition Item.cpp:419
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:336
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition Item.cpp:1056
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition Item.cpp:1258
void SetPaidMoney(uint32 money)
Definition Item.h:345
bool IsSoulBound() const
Definition Item.h:236
bool IsBOPTradable() const
Definition Item.h:262
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition Item.h:344
bool IsRefundable() const
Definition Item.h:261
void FSetState(ItemUpdateState state)
Definition Item.h:330
void SetPaidExtendedCost(uint32 iece)
Definition Item.h:346
void ClearSoulboundTradeable(Player *currentOwner)
Definition Item.cpp:1264
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:518
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:860
uint32 GetEntry() const
Definition Object.h:115
void AddRefundReference(ObjectGuid itemGUID)
Definition Player.cpp:15544
void AddTradeableItem(Item *item)
Definition PlayerStorage.cpp:4132
bool IsAlive() const
Definition Unit.h:1707
uint32 GetMapId() const
Definition Position.h:275
Definition AsioHacksFwd.h:47
STL namespace.
uint32 GetMaxStackSize() const
Definition ItemTemplate.h:729

References AddRefundReference(), AddTradeableItem(), CHAR_DEL_ITEM_REFUND_INSTANCE, CHAR_SEL_ITEM_BOP_TRADE, CHAR_SEL_ITEM_REFUNDS, CharacterDatabase, Item::ClearSoulboundTradeable(), Item::DeleteFromDB(), Item::DeleteFromInventoryDB(), Item::FSetState(), Field::Get(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldLocation::GetMapId(), ItemTemplate::GetMaxStackSize(), WorldObject::GetName(), Item::GetPlayedTime(), Item::GetTemplate(), HOUR, Unit::IsAlive(), Item::IsBOPTradable(), Item::IsLimitedToAnotherMapOrZone(), Item::IsRefundable(), Item::IsSoulBound(), ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_CONJURED, ITEM_REMOVED, Item::LoadFromDB(), LOG_DEBUG, LOG_ERROR, LOG_WARN, MINUTE, NewItemOrBag(), Object::RemoveFlag(), Item::SaveToDB(), PreparedStatementBase::SetData(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), Item::SetSoulboundTradeable(), sGameEventMgr, sObjectMgr, Acore::Tokenize(), ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory().

◆ _LoadMail()

void Player::_LoadMail ( PreparedQueryResult  mailsResult,
PreparedQueryResult  mailItemsResult 
)
protected
6156{
6157 time_t cur_time = GameTime::GetGameTime().count();
6158
6159 m_mail.clear();
6160
6161 std::unordered_map<uint32, Mail*> mailById;
6162
6163 if (mailsResult)
6164 {
6165 do
6166 {
6167 Field* fields = mailsResult->Fetch();
6168 Mail* m = new Mail;
6169
6170 m->messageID = fields[0].Get<uint32>();
6171 m->messageType = fields[1].Get<uint8>();
6172 m->sender = fields[2].Get<uint32>();
6173 m->receiver = fields[3].Get<uint32>();
6174 m->subject = fields[4].Get<std::string>();
6175 m->body = fields[5].Get<std::string>();
6176 m->expire_time = time_t(fields[6].Get<uint32>());
6177 m->deliver_time = time_t(fields[7].Get<uint32>());
6178 m->money = fields[8].Get<uint32>();
6179 m->COD = fields[9].Get<uint32>();
6180 m->checked = fields[10].Get<uint8>();
6181 m->stationery = fields[11].Get<uint8>();
6182 m->mailTemplateId = fields[12].Get<int16>();
6183
6184 if (cur_time > m->expire_time)
6185 {
6186 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6187 continue;
6188 }
6189
6190 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6191 {
6192 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6193 m->mailTemplateId = 0;
6194 }
6195
6197
6198 m_mail.push_back(m);
6199 mailById[m->messageID] = m;
6200 } while (mailsResult->NextRow());
6201 }
6202
6203 if (mailItemsResult)
6204 {
6205 do
6206 {
6207 Field* fields = mailItemsResult->Fetch();
6208 uint32 mailId = fields[14].Get<uint32>();
6209 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6210 } while (mailItemsResult->NextRow());
6211 }
6212
6214}
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
std::int16_t int16
Definition Define.h:104
@ MAIL_STATE_UNCHANGED
Definition Mail.h:68
void UpdateNextMailTimeAndUnreads()
Definition PlayerUpdates.cpp:436
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition PlayerStorage.cpp:6103
Definition Mail.h:167
ObjectGuid::LowType receiver
Definition Mail.h:173
uint8 messageType
Definition Mail.h:169
uint32 messageID
Definition Mail.h:168
time_t expire_time
Definition Mail.h:178
uint32 sender
Definition Mail.h:172
uint8 stationery
Definition Mail.h:170
std::string subject
Definition Mail.h:174
std::string body
Definition Mail.h:175
time_t deliver_time
Definition Mail.h:179
uint32 COD
Definition Mail.h:181
uint32 checked
Definition Mail.h:182
MailState state
Definition Mail.h:183
uint32 money
Definition Mail.h:180
uint16 mailTemplateId
Definition Mail.h:171

References _LoadMailedItem(), Mail::body, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_mail, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, Mail::receiver, Mail::sender, sMailTemplateStore, Mail::state, Mail::stationery, Mail::subject, and UpdateNextMailTimeAndUnreads().

Referenced by LoadFromDB().

◆ _LoadMailedItem()

Item * Player::_LoadMailedItem ( ObjectGuid const &  playerGuid,
Player player,
uint32  mailId,
Mail mail,
Field fields 
)
staticprotected
6104{
6105 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6106 uint32 itemEntry = fields[12].Get<uint32>();
6107
6108 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6109 if (!proto)
6110 {
6111 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6112 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6113
6114 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6115
6117 stmt->SetData(0, itemGuid);
6118 trans->Append(stmt);
6119
6120 CharacterDatabase.CommitTransaction(trans);
6121 return nullptr;
6122 }
6123
6124 Item* item = NewItemOrBag(proto);
6125
6126 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6127 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6128 {
6129 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6130
6132 stmt->SetData(0, itemGuid);
6133 CharacterDatabase.Execute(stmt);
6134
6135 item->FSetState(ITEM_REMOVED);
6136
6138 item->SaveToDB(temp);
6139 return nullptr;
6140 }
6141
6142 if (mail)
6143 {
6144 mail->AddItem(itemGuid, itemEntry);
6145 }
6146
6147 if (player)
6148 {
6149 player->AddMItem(item);
6150 }
6151
6152 return item;
6153}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition CharacterDatabase.h:112
void AddMItem(Item *it)
Definition Player.h:1681
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition Mail.h:185

References Mail::AddItem(), AddMItem(), CHAR_DEL_INVALID_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CharacterDatabase, ObjectGuid::Empty, Item::FSetState(), Field::Get(), WorldObject::GetName(), ITEM_REMOVED, Item::LoadFromDB(), LOG_ERROR, NewItemOrBag(), Item::SaveToDB(), PreparedStatementBase::SetData(), sObjectMgr, and ObjectGuid::ToString().

Referenced by _LoadMail(), and DeleteFromDB().

◆ _LoadMonthlyQuestStatus()

void Player::_LoadMonthlyQuestStatus ( PreparedQueryResult  result)
protected
6447{
6448 m_monthlyquests.clear();
6449
6450 if (result)
6451 {
6452 do
6453 {
6454 Field* fields = result->Fetch();
6455 uint32 quest_id = fields[0].Get<uint32>();
6456 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6457 if (!quest)
6458 continue;
6459
6460 m_monthlyquests.insert(quest_id);
6461 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6462 } while (result->NextRow());
6463 }
6464
6465 m_MonthlyQuestChanged = false;
6466}
QuestSet m_monthlyquests
Definition Player.h:2707

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_MonthlyQuestChanged, m_monthlyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadPetStable()

void Player::_LoadPetStable ( uint8  petStableSlots,
PreparedQueryResult  result 
)
protected
15856{
15857 if (!petStableSlots && !result)
15858 return;
15859
15860 m_petStable = std::make_unique<PetStable>();
15861 m_petStable->MaxStabledPets = petStableSlots;
15862
15863 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15864 {
15865 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15866 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15867
15868 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15869 }
15870
15871 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15872 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15873 if (result)
15874 {
15875 do
15876 {
15877 Field* fields = result->Fetch();
15878 PetStable::PetInfo petInfo;
15879 petInfo.PetNumber = fields[0].Get<uint32>();
15880 petInfo.CreatureId = fields[1].Get<uint32>();
15881 petInfo.DisplayId = fields[2].Get<uint32>();
15882 petInfo.Level = fields[3].Get<uint16>();
15883 petInfo.Experience = fields[4].Get<uint32>();
15884 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15885 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15886 petInfo.Name = fields[7].Get<std::string>();
15887 petInfo.WasRenamed = fields[8].Get<bool>();
15888 petInfo.Health = fields[9].Get<uint32>();
15889 petInfo.Mana = fields[10].Get<uint32>();
15890 petInfo.Happiness = fields[11].Get<uint32>();
15891 petInfo.ActionBar = fields[12].Get<std::string>();
15892 petInfo.LastSaveTime = fields[13].Get<uint32>();
15893 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15894 petInfo.Type = PetType(fields[15].Get<uint8>());
15895
15896 if (slot == PET_SAVE_AS_CURRENT)
15897 m_petStable->CurrentPet = std::move(petInfo);
15898 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15899 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15900 else if (slot == PET_SAVE_NOT_IN_SLOT)
15901 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15902
15903 } while (result->NextRow());
15904 }
15905}
PetSaveMode
Definition PetDefines.h:40
@ PET_SAVE_FIRST_STABLE_SLOT
Definition PetDefines.h:43
@ PET_SAVE_LAST_STABLE_SLOT
Definition PetDefines.h:44
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:45
@ PET_SAVE_AS_CURRENT
Definition PetDefines.h:42
PetType
Definition PetDefines.h:30
constexpr auto MAX_PET_STABLES
Definition PetDefines.h:36
ReactStates
Definition Unit.h:547
std::unique_ptr< PetStable > m_petStable
Definition Player.h:2982
Definition PetDefines.h:209
uint32 Mana
Definition PetDefines.h:219
uint32 Happiness
Definition PetDefines.h:220
uint32 CreatedBySpellId
Definition PetDefines.h:222
uint32 Health
Definition PetDefines.h:218
uint32 CreatureId
Definition PetDefines.h:215
bool WasRenamed
Definition PetDefines.h:226
uint8 Level
Definition PetDefines.h:223
uint32 DisplayId
Definition PetDefines.h:216
ReactStates ReactState
Definition PetDefines.h:224
std::string Name
Definition PetDefines.h:212
PetType Type
Definition PetDefines.h:225
uint32 Experience
Definition PetDefines.h:217
uint32 PetNumber
Definition PetDefines.h:214
uint32 LastSaveTime
Definition PetDefines.h:221
std::string ActionBar
Definition PetDefines.h:213

References PetStable::PetInfo::ActionBar, PetStable::PetInfo::CreatedBySpellId, PetStable::PetInfo::CreatureId, PetStable::PetInfo::DisplayId, PetStable::PetInfo::Experience, Field::Get(), Object::GetGUID(), PetStable::PetInfo::Happiness, PetStable::PetInfo::Health, PetStable::PetInfo::LastSaveTime, PetStable::PetInfo::Level, LOG_ERROR, m_petStable, PetStable::PetInfo::Mana, MAX_PET_STABLES, PetStable::PetInfo::Name, PET_SAVE_AS_CURRENT, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT, PET_SAVE_NOT_IN_SLOT, PetStable::PetInfo::PetNumber, PetStable::PetInfo::ReactState, Position::ToString(), PetStable::PetInfo::Type, and PetStable::PetInfo::WasRenamed.

Referenced by LoadFromDB().

◆ _LoadQuestStatus()

void Player::_LoadQuestStatus ( PreparedQueryResult  result)
protected
6229{
6230 uint16 slot = 0;
6231
6233 //QueryResult* result = CharacterDatabase.Query("SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3,
6234 // 11 12 13 14
6235 // itemcount4, itemcount5, itemcount6, playercount FROM character_queststatus WHERE guid = '{}'", GetGUID().GetCounter());
6236
6237 if (result)
6238 {
6239 do
6240 {
6241 Field* fields = result->Fetch();
6242
6243 uint32 quest_id = fields[0].Get<uint32>();
6244 // used to be new, no delete?
6245 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6246 if (quest)
6247 {
6248 // find or create
6249 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
6250
6251 uint8 qstatus = fields[1].Get<uint8>();
6252 if (qstatus < MAX_QUEST_STATUS)
6253 questStatusData.Status = QuestStatus(qstatus);
6254 else
6255 {
6256 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
6257 LOG_ERROR("entities.player", "Player {} ({}) has invalid quest {} status ({}), replaced by QUEST_STATUS_INCOMPLETE(3).",
6258 GetName(), GetGUID().ToString(), quest_id, qstatus);
6259 }
6260
6261 questStatusData.Explored = (fields[2].Get<uint8>() > 0);
6262
6263 time_t quest_time = time_t(fields[3].Get<uint32>());
6264
6265 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id))
6266 {
6267 AddTimedQuest(quest_id);
6268
6269 if (quest_time <= GameTime::GetGameTime().count())
6270 questStatusData.Timer = 1;
6271 else
6272 questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime().count()) * IN_MILLISECONDS);
6273 }
6274 else
6275 quest_time = 0;
6276
6277 for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
6278 questStatusData.CreatureOrGOCount[i] = fields[4 + i].Get<uint16>();
6279
6280 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
6281 questStatusData.ItemCount[i] = fields[8 + i].Get<uint16>();
6282
6283 questStatusData.PlayerCount = fields[14].Get<uint16>();
6284
6285 // add to quest log
6286 if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE)
6287 {
6288 SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped
6289
6290 if (questStatusData.Status == QUEST_STATUS_COMPLETE)
6292 else if (questStatusData.Status == QUEST_STATUS_FAILED)
6294
6295 for (uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
6296 if (questStatusData.CreatureOrGOCount[idx])
6297 SetQuestSlotCounter(slot, idx, questStatusData.CreatureOrGOCount[idx]);
6298
6299 if (questStatusData.PlayerCount)
6300 SetQuestSlotCounter(slot, QUEST_PVP_KILL_SLOT, questStatusData.PlayerCount);
6301
6302 ++slot;
6303 }
6304
6305 LOG_DEBUG("entities.player.loading", "Quest status is {{}} for quest {{}} for player ({})", questStatusData.Status, quest_id, GetGUID().ToString());
6306 }
6307 } while (result->NextRow());
6308 }
6309
6310 // clear quest log tail
6311 for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
6312 SetQuestSlot(i, 0);
6313}
@ QUEST_STATE_COMPLETE
Definition Player.h:638
@ QUEST_STATE_FAIL
Definition Player.h:639
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition QuestDef.h:35
#define MAX_QUEST_LOG_SIZE
Definition QuestDef.h:33
#define QUEST_PVP_KILL_SLOT
Definition QuestDef.h:43
QuestStatus
Definition QuestDef.h:99
@ QUEST_STATUS_FAILED
Definition QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:103
@ QUEST_STATUS_NONE
Definition QuestDef.h:100
@ MAX_QUEST_STATUS
Definition QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:101
@ QUEST_SPECIAL_FLAGS_TIMED
Definition QuestDef.h:178
QuestStatusMap m_QuestStatus
Definition Player.h:2806
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1415
void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
Definition Player.h:1506
void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer=0)
Definition Player.h:1498
void SetQuestSlotState(uint16 slot, uint32 state)
Definition Player.h:1513
void AddTimedQuest(uint32 quest_id)
Definition Player.h:1565
Definition QuestDef.h:407
uint32 Timer
Definition QuestDef.h:415
uint16 PlayerCount
Definition QuestDef.h:418
uint16 ItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:416
QuestStatus Status
Definition QuestDef.h:414
bool Explored
Definition QuestDef.h:419
uint16 CreatureOrGOCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:417

References AddTimedQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), GetQuestRewardStatus(), IN_MILLISECONDS, QuestStatusData::ItemCount, LOG_DEBUG, LOG_ERROR, m_QuestStatus, MAX_QUEST_LOG_SIZE, MAX_QUEST_STATUS, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_PVP_KILL_SLOT, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_COMPLETE, QUEST_STATE_FAIL, QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SetQuestSlot(), SetQuestSlotCounter(), SetQuestSlotState(), sObjectMgr, QuestStatusData::Status, QuestStatusData::Timer, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadQuestStatusRewarded()

void Player::_LoadQuestStatusRewarded ( PreparedQueryResult  result)
protected
6316{
6317 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6318
6319 if (result)
6320 {
6321 m_RewardedQuests.rehash(result->GetRowCount());
6322 do
6323 {
6324 Field* fields = result->Fetch();
6325
6326 uint32 quest_id = fields[0].Get<uint32>();
6327 // used to be new, no delete?
6328 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6329 if (quest)
6330 {
6331 // learn rewarded spell if unknown
6333
6334 // set rewarded title if any
6335 if (quest->GetCharTitleId())
6336 {
6337 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6338 SetTitle(titleEntry);
6339 }
6340
6341 if (quest->GetBonusTalents())
6342 m_questRewardTalentCount += quest->GetBonusTalents();
6343 }
6344
6345 m_RewardedQuests.insert(quest_id);
6346 } while (result->NextRow());
6347 }
6348}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition Player.h:2809
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition Player.cpp:13375
void learnQuestRewardedSpells()
Definition Player.cpp:12016
Definition DBCStructure.h:631

References Field::Get(), learnQuestRewardedSpells(), m_questRewardTalentCount, m_RewardedQuests, sCharTitlesStore, SetTitle(), and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadRandomBGStatus()

void Player::_LoadRandomBGStatus ( PreparedQueryResult  result)
protected
15754{
15755 if (result)
15756 m_IsBGRandomWinner = true;
15757}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

void Player::_LoadSeasonalQuestStatus ( PreparedQueryResult  result)
protected
6424{
6425 m_seasonalquests.clear();
6426
6427 if (result)
6428 {
6429 do
6430 {
6431 Field* fields = result->Fetch();
6432 uint32 quest_id = fields[0].Get<uint32>();
6433 uint32 event_id = fields[1].Get<uint32>();
6434 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6435 if (!quest)
6436 continue;
6437
6438 m_seasonalquests[event_id].insert(quest_id);
6439 LOG_DEBUG("entities.player.loading", "Seasonal quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6440 } while (result->NextRow());
6441 }
6442
6443 m_SeasonalQuestChanged = false;
6444}
SeasonalEventQuestMap m_seasonalquests
Definition Player.h:2708

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_SeasonalQuestChanged, m_seasonalquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSkills()

void Player::_LoadSkills ( PreparedQueryResult  result)
protected
13713{
13714 // 0 1 2
13715 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13716
13717 uint32 count = 0;
13718 std::unordered_map<uint32, uint32> loadedSkillValues;
13719 if (result)
13720 {
13721 do
13722 {
13723 Field* fields = result->Fetch();
13724 uint16 skill = fields[0].Get<uint16>();
13725 uint16 value = fields[1].Get<uint16>();
13726 uint16 max = fields[2].Get<uint16>();
13727
13728 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13729 if (!rcEntry)
13730 {
13731 LOG_ERROR("entities.player", "Character {} has skill {} that does not exist.", GetGUID().ToString(), skill);
13732 continue;
13733 }
13734
13735 // set fixed skill ranges
13736 switch (GetSkillRangeType(rcEntry))
13737 {
13738 case SKILL_RANGE_LANGUAGE: // 300..300
13739 value = max = 300;
13740 break;
13741 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13742 value = max = 1;
13743 break;
13744 case SKILL_RANGE_LEVEL:
13746 default:
13747 break;
13748 }
13749
13750 if (value == 0)
13751 {
13752 LOG_ERROR("entities.player", "Character {} has skill {} with value 0. Will be deleted.", GetGUID().ToString(), skill);
13753
13755
13756 stmt->SetData(0, GetGUID().GetCounter());
13757 stmt->SetData(1, skill);
13758
13759 CharacterDatabase.Execute(stmt);
13760
13761 continue;
13762 }
13763
13764 uint16 skillStep = 0;
13765 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13766 {
13767 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13768 {
13769 if (skillTier->Value[skillStep] == max)
13770 {
13771 skillStep = i + 1;
13772 break;
13773 }
13774 }
13775 }
13776
13777 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13778
13781
13782 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13783
13784 loadedSkillValues[skill] = value;
13785
13786 ++count;
13787
13788 if (count >= PLAYER_MAX_SKILLS) // client limit
13789 {
13790 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13791 break;
13792 }
13793 } while (result->NextRow());
13794 }
13795
13796 // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
13797 for (auto& skill : loadedSkillValues)
13798 {
13799 learnSkillRewardedSpells(skill.first, skill.second);
13800 }
13801
13802 for (; count < PLAYER_MAX_SKILLS; ++count)
13803 {
13807 }
13808}
@ CHAR_DEL_CHARACTER_SKILL
Definition CharacterDatabase.h:316
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition DBCStores.cpp:895
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
#define MAX_SKILL_STEP
Definition DBCStructure.h:1579
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:87
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition ObjectMgr.cpp:8900
@ SKILL_RANGE_MONO
Definition ObjectMgr.h:676
@ SKILL_RANGE_LANGUAGE
Definition ObjectMgr.h:674
@ SKILL_RANGE_LEVEL
Definition ObjectMgr.h:675
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition Player.h:80
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition Player.h:79
#define PLAYER_SKILL_INDEX(x)
Definition Player.h:78
#define PLAYER_MAX_SKILLS
Definition Player.h:70
@ SKILL_UNCHANGED
Definition Player.h:644
#define MAKE_SKILL_VALUE(v, m)
Definition Player.h:84
SkillStatusMap mSkillStatus
Definition Player.h:2813
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition Player.cpp:12029
Definition DBCStructure.h:1568
Definition Player.h:651
Definition DBCStructure.h:1614

References CHAR_DEL_CHARACTER_SKILL, CharacterDatabase, Field::Get(), Unit::getClass(), Object::GetGUID(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, MAX_SKILL_STEP, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), Unit::SetUInt32Value(), SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_UNCHANGED, sSkillTiersStore, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpellCooldowns()

void Player::_LoadSpellCooldowns ( PreparedQueryResult  result)
3601{
3602 // some cooldowns can be already set at aura loading...
3603
3604 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3605
3606 if (result)
3607 {
3608 time_t curTime = GameTime::GetGameTime().count();
3609
3610 do
3611 {
3612 Field* fields = result->Fetch();
3613 uint32 spell_id = fields[0].Get<uint32>();
3614 uint16 category = fields[1].Get<uint16>();
3615 uint32 item_id = fields[2].Get<uint32>();
3616 uint32 db_time = fields[3].Get<uint32>();
3617 bool needSend = fields[4].Get<bool>();
3618
3619 if (!sSpellMgr->GetSpellInfo(spell_id))
3620 {
3621 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3622 continue;
3623 }
3624
3625 // skip outdated cooldown
3626 if (db_time <= curTime)
3627 continue;
3628
3629 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3630
3631 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3632 } while (result->NextRow());
3633 }
3634}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Player.cpp:11103

References _AddSpellCooldown(), Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, sSpellMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpells()

void Player::_LoadSpells ( PreparedQueryResult  result)
protected
6469{
6470 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6471
6472 if (result)
6473 {
6474 do
6475 // xinef: checked
6476 addSpell((*result)[0].Get<uint32>(), (*result)[1].Get<uint8>(), true);
6477 while (result->NextRow());
6478 }
6479}
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition Player.cpp:3069

References addSpell().

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
15044{
15045 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
15046 if (result)
15047 {
15048 do
15049 {
15050 // xinef: checked
15051 uint32 spellId = (*result)[0].Get<uint32>();
15052 uint8 specMask = (*result)[1].Get<uint8>();
15053 addTalent(spellId, specMask, 0);
15054 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
15055 ASSERT(talentPos);
15056
15057 } while (result->NextRow());
15058 }
15059}
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition DBCStores.cpp:677
#define ASSERT
Definition Errors.h:68
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition Player.cpp:2918
Definition DBCStructure.h:2231

References addTalent(), ASSERT, and GetTalentSpellPos().

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

void Player::_LoadWeeklyQuestStatus ( PreparedQueryResult  result)
protected
6402{
6403 m_weeklyquests.clear();
6404
6405 if (result)
6406 {
6407 do
6408 {
6409 Field* fields = result->Fetch();
6410 uint32 quest_id = fields[0].Get<uint32>();
6411 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6412 if (!quest)
6413 continue;
6414
6415 m_weeklyquests.insert(quest_id);
6416 LOG_DEBUG("entities.player.loading", "Weekly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6417 } while (result->NextRow());
6418 }
6419
6420 m_WeeklyQuestChanged = false;
6421}
QuestSet m_weeklyquests
Definition Player.h:2706

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_WeeklyQuestChanged, m_weeklyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7551{
7552 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7553
7554 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7555 {
7556 if (m_items[i])
7557 {
7558 ItemTemplate const* proto = m_items[i]->GetTemplate();
7559 if (!proto)
7560 continue;
7561
7562 // item set bonuses not dependent from item broken state
7563 if (proto->ItemSet)
7564 RemoveItemsSetItem(this, proto);
7565
7566 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7567 continue;
7568
7569 ApplyItemEquipSpell(m_items[i], false);
7570 ApplyEnchantment(m_items[i], false);
7571 }
7572 }
7573
7574 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7575 {
7576 if (m_items[i])
7577 {
7578 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7579 continue;
7580 ItemTemplate const* proto = m_items[i]->GetTemplate();
7581 if (!proto)
7582 continue;
7583
7584 uint32 attacktype = Player::GetAttackBySlot(i);
7585 if (attacktype < MAX_ATTACK)
7587
7588 _ApplyItemBonuses(proto, i, false);
7589
7590 if (i == EQUIPMENT_SLOT_RANGED)
7592 }
7593 }
7594
7595 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7596}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition Item.cpp:118

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_ATTACK, and RemoveItemsSetItem().

Referenced by _RemoveAllStatBonuses().

◆ _RemoveAllStatBonuses()

void Player::_RemoveAllStatBonuses ( )
992{
993 SetCanModifyStats(false);
994
997
998 SetCanModifyStats(true);
999
1001}
void _RemoveAllItemMods()
Definition Player.cpp:7550
void _RemoveAllAuraStatMods()
Definition Unit.cpp:5515

References Unit::_RemoveAllAuraStatMods(), _RemoveAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2989{
2990 // xinef: remove spec mask from iterator
2991 itr->second->specMask &= ~specMask;
2992
2993 // xinef: if talent is not present in any spec - remove
2994 if (itr->second->specMask == 0)
2995 {
2996 if (itr->second->State == PLAYERSPELL_NEW)
2997 {
2998 delete itr->second;
2999 m_talents.erase(itr);
3000 return;
3001 }
3002 else
3003 itr->second->State = PLAYERSPELL_REMOVED;
3004 }
3005 // xinef: otherwise save changes to DB
3006 else if (itr->second->State != PLAYERSPELL_NEW)
3007 itr->second->State = PLAYERSPELL_CHANGED;
3008}

References m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, and PLAYERSPELL_REMOVED.

Referenced by _removeTalent(), addTalent(), and resetTalents().

◆ _removeTalent() [2/2]

void Player::_removeTalent ( uint32  spellId,
uint8  specMask 
)
2980{
2981 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2982 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2983 return;
2984
2985 _removeTalent(itr, specMask);
2986}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition Player.cpp:2988

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
3011{
3012 RemoveOwnedAura(spellId);
3013
3014 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3015 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3016 {
3017 // pussywizard: remove pet auras
3018 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
3019 RemovePetAura(petSpell);
3020
3021 // pussywizard: remove all triggered auras
3022 if (spellInfo->Effects[i].TriggerSpell > 0)
3023 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3024
3025 // xinef: remove temporary spells added by talent
3026 // xinef: recursively remove all learnt spells
3027 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3028 {
3029 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3030 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
3031 }
3032 }
3033}
Definition SpellMgr.h:470
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition Player.cpp:3345
void _removeTalentAurasAndSpells(uint32 spellId)
Definition Player.cpp:3010
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4738
void RemovePetAura(PetAura const *petSpell)
Definition Unit.cpp:17375
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4942

References _removeTalentAurasAndSpells(), SpellInfo::Effects, MAX_SPELL_EFFECTS, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SPEC_MASK_ALL, SPELL_EFFECT_LEARN_SPELL, and sSpellMgr.

Referenced by _removeTalentAurasAndSpells(), ActivateSpec(), addTalent(), and resetTalents().

◆ _SaveActions()

void Player::_SaveActions ( CharacterDatabaseTransaction  trans)
protected
7136{
7137 CharacterDatabasePreparedStatement* stmt = nullptr;
7138
7139 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7140 {
7141 switch (itr->second.uState)
7142 {
7143 case ACTIONBUTTON_NEW:
7144 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7145 stmt->SetData(0, GetGUID().GetCounter());
7146 stmt->SetData(1, m_activeSpec);
7147 stmt->SetData(2, itr->first);
7148 stmt->SetData(3, itr->second.GetAction());
7149 stmt->SetData(4, uint8(itr->second.GetType()));
7150 trans->Append(stmt);
7151
7152 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7153 ++itr;
7154 break;
7156 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7157 stmt->SetData(0, itr->second.GetAction());
7158 stmt->SetData(1, uint8(itr->second.GetType()));
7159 stmt->SetData(2, GetGUID().GetCounter());
7160 stmt->SetData(3, itr->first);
7161 stmt->SetData(4, m_activeSpec);
7162 trans->Append(stmt);
7163
7164 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7165 ++itr;
7166 break;
7168 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7169 stmt->SetData(0, GetGUID().GetCounter());
7170 stmt->SetData(1, itr->first);
7171 stmt->SetData(2, m_activeSpec);
7172 trans->Append(stmt);
7173
7174 m_actionButtons.erase(itr++);
7175 break;
7176 default:
7177 ++itr;
7178 break;
7179 }
7180 }
7181}
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition CharacterDatabase.h:432
@ CHAR_UPD_CHAR_ACTION
Definition CharacterDatabase.h:431
@ CHAR_INS_CHAR_ACTION
Definition CharacterDatabase.h:430
@ ACTIONBUTTON_NEW
Definition Player.h:223
@ ACTIONBUTTON_CHANGED
Definition Player.h:222

References ACTIONBUTTON_CHANGED, ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, ACTIONBUTTON_UNCHANGED, CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, CHAR_INS_CHAR_ACTION, CHAR_UPD_CHAR_ACTION, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_actionButtons, m_activeSpec, and PreparedStatementBase::SetData().

Referenced by ActivateSpec(), SaveToDB(), and UpdateSpecCount().

◆ _SaveAuras()

void Player::_SaveAuras ( CharacterDatabaseTransaction  trans,
bool  logout 
)
protected
7184{
7186 stmt->SetData(0, GetGUID().GetCounter());
7187 trans->Append(stmt);
7188
7189 for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
7190 {
7191 if (!itr->second->CanBeSaved())
7192 continue;
7193
7194 Aura* aura = itr->second;
7195 if (!logout && aura->GetDuration() < 60 * IN_MILLISECONDS )
7196 continue;
7197
7198 int32 damage[MAX_SPELL_EFFECTS];
7199 int32 baseDamage[MAX_SPELL_EFFECTS];
7200 uint8 effMask = 0;
7201 uint8 recalculateMask = 0;
7202 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
7203 {
7204 if (AuraEffect const* effect = aura->GetEffect(i))
7205 {
7206 baseDamage[i] = effect->GetBaseAmount();
7207 damage[i] = effect->GetAmount();
7208 effMask |= 1 << i;
7209 if (effect->CanBeRecalculated())
7210 recalculateMask |= 1 << i;
7211 }
7212 else
7213 {
7214 baseDamage[i] = 0;
7215 damage[i] = 0;
7216 }
7217 }
7218
7219 uint8 index = 0;
7220 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
7221 stmt->SetData(index++, GetGUID().GetCounter());
7222 stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
7223 stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
7224 stmt->SetData(index++, itr->second->GetId());
7225 stmt->SetData(index++, effMask);
7226 stmt->SetData(index++, recalculateMask);
7227 stmt->SetData(index++, itr->second->GetStackAmount());
7228 stmt->SetData(index++, damage[0]);
7229 stmt->SetData(index++, damage[1]);
7230 stmt->SetData(index++, damage[2]);
7231 stmt->SetData(index++, baseDamage[0]);
7232 stmt->SetData(index++, baseDamage[1]);
7233 stmt->SetData(index++, baseDamage[2]);
7234 stmt->SetData(index++, itr->second->GetMaxDuration());
7235 stmt->SetData(index++, itr->second->GetDuration());
7236 stmt->SetData(index, itr->second->GetCharges());
7237 trans->Append(stmt);
7238 }
7239}
@ CHAR_INS_AURA
Definition CharacterDatabase.h:196
@ CHAR_DEL_CHAR_AURA
Definition CharacterDatabase.h:407
Definition SpellAuraEffects.h:39
int32 GetDuration() const
Definition SpellAuras.h:133
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
AuraMap m_ownedAuras
Definition Unit.h:2080

References CHAR_DEL_CHAR_AURA, CHAR_INS_AURA, CharacterDatabase, ObjectGuid::GetCounter(), Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), IN_MILLISECONDS, Unit::m_ownedAuras, MAX_SPELL_EFFECTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB(), and SpawnCorpseBones().

◆ _SaveCharacter()

void Player::_SaveCharacter ( bool  create,
CharacterDatabaseTransaction  trans 
)
protected

Insert query TO DO: Filter out more redundant fields that can take their default value at player create

14719{
14720 CharacterDatabasePreparedStatement* stmt = nullptr;
14721 uint8 index = 0;
14722
14723 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14724
14725 if (create)
14726 {
14729 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14730 stmt->SetData(index++, GetGUID().GetCounter());
14731 stmt->SetData(index++, GetSession()->GetAccountId());
14732 stmt->SetData(index++, GetName());
14733 stmt->SetData(index++, getRace(true));
14734 stmt->SetData(index++, getClass());
14735 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14736 stmt->SetData(index++, GetLevel());
14737 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14738 stmt->SetData(index++, GetMoney());
14739 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14740 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14741 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14742 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14743 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14744 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14745 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14746 stmt->SetData(index++, (uint32)GetPlayerFlags());
14747 stmt->SetData(index++, (uint16)GetMapId());
14748 stmt->SetData(index++, (uint32)GetInstanceId());
14749 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14750 stmt->SetData(index++, finiteAlways(GetPositionX()));
14751 stmt->SetData(index++, finiteAlways(GetPositionY()));
14752 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14753 stmt->SetData(index++, finiteAlways(GetOrientation()));
14754 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14755 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14756 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14757 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14758
14759 int32 lowGuidOrSpawnId = 0;
14760 if (Transport* transport = GetTransport())
14761 {
14762 if (transport->IsMotionTransport())
14763 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14764 else if (transport->IsStaticTransport())
14765 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14766 }
14767 stmt->SetData(index++, lowGuidOrSpawnId);
14768
14769 std::ostringstream ss;
14770 ss << m_taxi;
14771 stmt->SetData(index++, ss.str());
14772 stmt->SetData(index++, m_cinematic);
14773 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14774 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14775 stmt->SetData(index++, finiteAlways(_restBonus));
14776 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14777 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14778 //save, far from tavern/city
14779 //save, but in tavern/city
14780 stmt->SetData(index++, m_resetTalentsCost);
14781 stmt->SetData(index++, uint32(m_resetTalentsTime));
14782 stmt->SetData(index++, (uint16)m_ExtraFlags);
14783 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14784 stmt->SetData(index++, (uint16)m_atLoginFlags);
14785 stmt->SetData(index++, GetZoneId());
14786 stmt->SetData(index++, uint32(m_deathExpireTime));
14787
14788 ss.str("");
14790
14791 stmt->SetData(index++, ss.str());
14792 stmt->SetData(index++, GetArenaPoints());
14793 stmt->SetData(index++, GetHonorPoints());
14797 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14798 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14802 stmt->SetData(index++, GetDrunkValue());
14803 stmt->SetData(index++, GetHealth());
14804
14805 for (uint32 i = 0; i < MAX_POWERS; ++i)
14806 stmt->SetData(index++, GetPower(Powers(i)));
14807
14808 stmt->SetData(index++, GetSession()->GetLatency());
14809
14810 stmt->SetData(index++, m_specsCount);
14811 stmt->SetData(index++, m_activeSpec);
14812
14813 ss.str("");
14814 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14815 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14816 stmt->SetData(index++, ss.str());
14817
14818 ss.str("");
14819 // cache equipment...
14820 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14822
14823 // ...and bags for enum opcode
14825 {
14826 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14827 ss << item->GetEntry();
14828 else
14829 ss << '0';
14830 ss << " 0 ";
14831 }
14832
14833 stmt->SetData(index++, ss.str());
14834 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14835
14836 ss.str("");
14837 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14839
14840 stmt->SetData(index++, ss.str());
14841 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14842 stmt->SetData(index++, m_grantableLevels);
14843 stmt->SetData(index++, _innTriggerId);
14844 stmt->SetData(index++, m_extraBonusTalentCount);
14845 }
14846 else
14847 {
14848 // Update query
14849 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14850 stmt->SetData(index++, GetName());
14851 stmt->SetData(index++, getRace(true));
14852 stmt->SetData(index++, getClass());
14853 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14854 stmt->SetData(index++, GetLevel());
14855 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14856 stmt->SetData(index++, GetMoney());
14857 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14858 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14859 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14860 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14861 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14862 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14863 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14864 stmt->SetData(index++, GetPlayerFlags());
14865
14866 if (!IsBeingTeleported())
14867 {
14869 if (Map* m = FindMap())
14870 if (m->IsDungeon())
14871 {
14872 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14873 else rd = m->GetDifficulty();
14874 }
14875 stmt->SetData(index++, (uint16)GetMapId());
14876 stmt->SetData(index++, (uint32)GetInstanceId());
14877 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14878 stmt->SetData(index++, finiteAlways(GetPositionX()));
14879 stmt->SetData(index++, finiteAlways(GetPositionY()));
14880 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14881 stmt->SetData(index++, finiteAlways(GetOrientation()));
14882 }
14883 else
14884 {
14885 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14886 stmt->SetData(index++, (uint32)0);
14887 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14888 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14889 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14890 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14891 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14892 }
14893
14894 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14895 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14896 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14897 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14898
14899 int32 lowGuidOrSpawnId = 0;
14900 if (Transport* transport = GetTransport())
14901 {
14902 if (transport->IsMotionTransport())
14903 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14904 else if (transport->IsStaticTransport())
14905 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14906 }
14907 stmt->SetData(index++, lowGuidOrSpawnId);
14908
14909 std::ostringstream ss;
14910 ss << m_taxi;
14911 stmt->SetData(index++, ss.str());
14912 stmt->SetData(index++, m_cinematic);
14913 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14914 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14915 stmt->SetData(index++, finiteAlways(_restBonus));
14916 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14917 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14918 //save, far from tavern/city
14919 //save, but in tavern/city
14920 stmt->SetData(index++, m_resetTalentsCost);
14921 stmt->SetData(index++, uint32(m_resetTalentsTime));
14922 stmt->SetData(index++, (uint16)m_ExtraFlags);
14923 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14924 stmt->SetData(index++, (uint16)m_atLoginFlags);
14925 stmt->SetData(index++, GetZoneId());
14926 stmt->SetData(index++, uint32(m_deathExpireTime));
14927
14928 ss.str("");
14930
14931 stmt->SetData(index++, ss.str());
14932 stmt->SetData(index++, GetArenaPoints());
14933 stmt->SetData(index++, GetHonorPoints());
14937 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14938 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14942 stmt->SetData(index++, GetDrunkValue());
14943 stmt->SetData(index++, GetHealth());
14944
14945 for (uint32 i = 0; i < MAX_POWERS; ++i)
14946 stmt->SetData(index++, GetPower(Powers(i)));
14947
14948 stmt->SetData(index++, GetSession()->GetLatency());
14949
14950 stmt->SetData(index++, m_specsCount);
14951 stmt->SetData(index++, m_activeSpec);
14952
14953 ss.str("");
14954 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14955 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14956 stmt->SetData(index++, ss.str());
14957
14958 ss.str("");
14959 // cache equipment...
14960 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14962
14963 // ...and bags for enum opcode
14965 {
14966 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14967 ss << item->GetEntry();
14968 else
14969 ss << '0';
14970 ss << " 0 ";
14971 }
14972
14973 stmt->SetData(index++, ss.str());
14974 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14975
14976 ss.str("");
14977 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14979
14980 stmt->SetData(index++, ss.str());
14981 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14982 stmt->SetData(index++, m_grantableLevels);
14983 stmt->SetData(index++, _innTriggerId);
14984 stmt->SetData(index++, m_extraBonusTalentCount);
14985
14986 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
14987 // Index
14988 stmt->SetData(index++, GetGUID().GetCounter());
14989 }
14990
14991 trans->Append(stmt);
14992}
@ CHAR_INS_CHARACTER
Definition CharacterDatabase.h:271
@ CHAR_UPD_CHARACTER
Definition CharacterDatabase.h:272
Difficulty
Definition DBCEnums.h:266
#define KNOWN_TITLES_SIZE
Definition Player.h:558
@ PLAYER_FLAGS_RESTING
Definition Player.h:484
@ INVENTORY_SLOT_BAG_START
Definition Player.h:704
#define PLAYER_EXPLORED_ZONES_SIZE
Definition Player.h:72
Powers
Definition SharedDefines.h:268
@ PLAYER_FIELD_TODAY_CONTRIBUTION
Definition UpdateFields.h:375
@ PLAYER_BYTES_3
Definition UpdateFields.h:183
@ PLAYER_XP
Definition UpdateFields.h:339
@ PLAYER_CHOSEN_TITLE
Definition UpdateFields.h:324
@ PLAYER_EXPLORED_ZONES_1
Definition UpdateFields.h:357
@ PLAYER_FIELD_KNOWN_CURRENCIES
Definition UpdateFields.h:338
@ PLAYER_BYTES_2
Definition UpdateFields.h:182
@ PLAYER__FIELD_KNOWN_TITLES
Definition UpdateFields.h:335
@ PLAYER_BYTES
Definition UpdateFields.h:181
@ PLAYER_FIELD_KILLS
Definition UpdateFields.h:374
@ PLAYER_FIELD_YESTERDAY_CONTRIBUTION
Definition UpdateFields.h:376
@ PLAYER_FIELD_WATCHED_FACTION_INDEX
Definition UpdateFields.h:379
@ PLAYER_VISIBLE_ITEM_1_ENTRYID
Definition UpdateFields.h:286
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition UpdateFields.h:377
@ PLAYER_FIELD_BYTES
Definition UpdateFields.h:368
Definition Map.h:311
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:323
uint16 GetUInt16Value(uint16 index, uint8 offset) const
Definition Object.cpp:330
uint64 GetUInt64Value(uint16 index) const
Definition Object.cpp:311
std::string SaveTaxiDestinationsToString()
Definition PlayerTaxi.cpp:193
Difficulty GetRaidDifficulty() const
Definition Player.h:1929
WorldLocation & GetTeleportDest()
Definition Player.h:2097
uint32 GetArenaPoints() const
Definition Player.h:2161
uint8 GetDrunkValue() const
Definition Player.h:2179
Item * GetItemByPos(uint16 pos) const
Definition PlayerStorage.cpp:441
uint32 GetHonorPoints() const
Definition Player.h:2160
PlayerFlags GetPlayerFlags() const
Definition Player.h:1124
uint32 GetMoney() const
Definition Player.h:1616
PlayerTaxi m_taxi
Definition Player.h:1160
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1125
Difficulty GetDungeonDifficulty() const
Definition Player.h:1928
bool IsBeingTeleported() const
Definition Player.h:2098
Definition Transport.h:29
uint32 GetHealth() const
Definition Unit.h:1038
uint32 GetPower(Powers power) const
Definition Unit.h:1065
float GetTransOffsetX() const
Definition Object.h:598
uint32 GetInstanceId() const
Definition Object.h:448
float GetTransOffsetY() const
Definition Object.h:599
float GetTransOffsetZ() const
Definition Object.h:600
Transport * GetTransport() const
Definition Object.h:597
float GetTransOffsetO() const
Definition Object.h:601
float GetPositionZ() const
Definition Position.h:118
float GetOrientation() const
Definition Position.h:119
float GetPositionX() const
Definition Position.h:116
float GetPositionY() const
Definition Position.h:117

References _innTriggerId, _restBonus, CHAR_INS_CHARACTER, CHAR_UPD_CHARACTER, CharacterDatabase, EQUIPMENT_SLOT_END, WorldObject::FindMap(), GetArenaPoints(), Object::GetByteValue(), Unit::getClass(), ObjectGuid::GetCounter(), GetDrunkValue(), GetDungeonDifficulty(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealth(), GetHonorPoints(), WorldObject::GetInstanceId(), GetItemByPos(), WorldSession::GetLatency(), Unit::GetLevel(), WorldLocation::GetMapId(), GetMoney(), WorldObject::GetName(), Position::GetOrientation(), GetPlayerFlags(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetPower(), Unit::getRace(), GetRaidDifficulty(), GetSession(), GetTeleportDest(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), Object::GetUInt16Value(), Object::GetUInt32Value(), Object::GetUInt64Value(), WorldObject::GetZoneId(), HasPlayerFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, IsBeingTeleported(), Object::IsInWorld(), KNOWN_TITLES_SIZE, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, m_extraBonusTalentCount, m_ExtraFlags, m_grantableLevels, m_petStable, m_Played_time, m_resetTalentsCost, m_resetTalentsTime, m_specsCount, m_taxi, MAX_POWERS, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_BYTES, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_RESTING, PLAYER_VISIBLE_ITEM_1_ENTRYID, PLAYER_XP, WorldSession::PlayerLogout(), PlayerTaxi::SaveTaxiDestinationsToString(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveDailyQuestStatus()

void Player::_SaveDailyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7522{
7524 return;
7525
7526 m_DailyQuestChanged = false;
7527
7528 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7529
7530 // we don't need transactions here.
7532 stmt->SetData(0, GetGUID().GetCounter());
7533 trans->Append(stmt);
7534 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7535 {
7536 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7537 {
7538 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7539 stmt->SetData(0, GetGUID().GetCounter());
7540 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7542 trans->Append(stmt);
7543 }
7544 }
7545
7546 if (!m_DFQuests.empty())
7547 {
7548 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7549 {
7550 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7551 stmt->SetData(0, GetGUID().GetCounter());
7552 stmt->SetData(1, (*itr));
7554 trans->Append(stmt);
7555 }
7556 }
7557}
@ CHAR_DEL_QUEST_STATUS_DAILY_CHAR
Definition CharacterDatabase.h:59
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition CharacterDatabase.h:74

References CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveEntryPoint()

void Player::_SaveEntryPoint ( CharacterDatabaseTransaction  trans)
protected
14636{
14637 // xinef: dont save joinpos with invalid mapid
14638 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14639 if (!mEntry)
14640 return;
14641
14643 stmt->SetData(0, GetGUID().GetCounter());
14644 trans->Append(stmt);
14645
14646 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14647 stmt->SetData(0, GetGUID().GetCounter());
14653 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14654 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14656 trans->Append(stmt);
14657}
@ CHAR_INS_PLAYER_ENTRY_POINT
Definition CharacterDatabase.h:237
@ CHAR_DEL_PLAYER_ENTRY_POINT
Definition CharacterDatabase.h:238

References CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_INS_PLAYER_ENTRY_POINT, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, PreparedStatementBase::SetData(), sMapStore, and EntryPointData::taxiPath.

Referenced by SaveToDB().

◆ _SaveEquipmentSets()

void Player::_SaveEquipmentSets ( CharacterDatabaseTransaction  trans)
protected
14585{
14586 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14587 {
14588 uint32 index = itr->first;
14589 EquipmentSet& eqset = itr->second;
14590 CharacterDatabasePreparedStatement* stmt = nullptr;
14591 uint8 j = 0;
14592 switch (eqset.state)
14593 {
14595 ++itr;
14596 break; // nothing do
14598 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14599 stmt->SetData(j++, eqset.Name.c_str());
14600 stmt->SetData(j++, eqset.IconName.c_str());
14601 stmt->SetData(j++, eqset.IgnoreMask);
14602 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14603 stmt->SetData(j++, eqset.Items[i].GetCounter());
14604 stmt->SetData(j++, GetGUID().GetCounter());
14605 stmt->SetData(j++, eqset.Guid);
14606 stmt->SetData(j, index);
14607 trans->Append(stmt);
14609 ++itr;
14610 break;
14611 case EQUIPMENT_SET_NEW:
14612 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14613 stmt->SetData(j++, GetGUID().GetCounter());
14614 stmt->SetData(j++, eqset.Guid);
14615 stmt->SetData(j++, index);
14616 stmt->SetData(j++, eqset.Name.c_str());
14617 stmt->SetData(j++, eqset.IconName.c_str());
14618 stmt->SetData(j++, eqset.IgnoreMask);
14619 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14620 stmt->SetData(j++, eqset.Items[i].GetCounter());
14621 trans->Append(stmt);
14623 ++itr;
14624 break;
14626 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14627 stmt->SetData(0, eqset.Guid);
14628 trans->Append(stmt);
14629 m_EquipmentSets.erase(itr++);
14630 break;
14631 }
14632 }
14633}
@ CHAR_UPD_EQUIP_SET
Definition CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition CharacterDatabase.h:194
@ EQUIPMENT_SET_CHANGED
Definition Player.h:748
@ EQUIPMENT_SET_DELETED
Definition Player.h:750
@ EQUIPMENT_SET_NEW
Definition Player.h:749

References CHAR_DEL_EQUIP_SET, CHAR_INS_EQUIP_SET, CHAR_UPD_EQUIP_SET, CharacterDatabase, EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, ObjectGuid::GetCounter(), Object::GetGUID(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, EquipmentSet::Name, PreparedStatementBase::SetData(), and EquipmentSet::state.

Referenced by SaveToDB().

◆ _SaveGlyphs()

void Player::_SaveGlyphs ( CharacterDatabaseTransaction  trans)
protected
15018{
15019 if (!NeedToSaveGlyphs())
15020 return;
15021
15023 stmt->SetData(0, GetGUID().GetCounter());
15024 trans->Append(stmt);
15025
15026 for (uint8 spec = 0; spec < m_specsCount; ++spec)
15027 {
15028 uint8 index = 0;
15029
15030 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
15031 stmt->SetData(index++, GetGUID().GetCounter());
15032 stmt->SetData(index++, spec);
15033
15034 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
15035 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
15036
15037 trans->Append(stmt);
15038 }
15039
15040 SetNeedToSaveGlyphs(false);
15041}
@ CHAR_DEL_CHAR_GLYPHS
Definition CharacterDatabase.h:420
@ CHAR_INS_CHAR_GLYPHS
Definition CharacterDatabase.h:454
void SetNeedToSaveGlyphs(bool val)
Definition Player.h:2610
bool NeedToSaveGlyphs()
Definition Player.h:2609

References CHAR_DEL_CHAR_GLYPHS, CHAR_INS_CHAR_GLYPHS, CharacterDatabase, Object::GetGUID(), m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, NeedToSaveGlyphs(), PreparedStatementBase::SetData(), and SetNeedToSaveGlyphs().

Referenced by SaveToDB().

◆ _SaveInstanceTimeRestrictions()

void Player::_SaveInstanceTimeRestrictions ( CharacterDatabaseTransaction  trans)
protected
15908{
15909 if (_instanceResetTimes.empty())
15910 return;
15911
15913 stmt->SetData(0, GetSession()->GetAccountId());
15914 trans->Append(stmt);
15915
15916 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15917 {
15918 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
15919 stmt->SetData(0, GetSession()->GetAccountId());
15920 stmt->SetData(1, itr->first);
15921 stmt->SetData(2, (int64)itr->second);
15922 trans->Append(stmt);
15923 }
15924}
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition CharacterDatabase.h:134
std::int64_t int64
Definition Define.h:102
uint32 GetAccountId() const
Definition WorldSession.h:375

References _instanceResetTimes, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CharacterDatabase, WorldSession::GetAccountId(), GetSession(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveInventory()

void Player::_SaveInventory ( CharacterDatabaseTransaction  trans)
protected
7242{
7243 CharacterDatabasePreparedStatement* stmt = nullptr;
7244 // force items in buyback slots to new state
7245 // and remove those that aren't already
7246 for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i)
7247 {
7248 Item* item = m_items[i];
7249 if (!item)
7250 continue;
7251
7252 if (item->GetState() == ITEM_NEW)
7253 {
7254 // Xinef: item is removed, remove loot from storage if any
7256 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7257 continue;
7258 }
7259
7260 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7261 stmt->SetData(0, item->GetGUID().GetCounter());
7262 trans->Append(stmt);
7263
7264 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7265 stmt->SetData(0, item->GetGUID().GetCounter());
7266 trans->Append(stmt);
7268
7269 // Xinef: item is removed, remove loot from storage if any
7271 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7272 }
7273
7274 // Updated played time for refundable items. We don't do this in Player::Update because there's simply no need for it,
7275 // the client auto counts down in real time after having received the initial played time on the first
7276 // SMSG_ITEM_REFUND_INFO_RESPONSE packet.
7277 // Item::UpdatePlayedTime is only called when needed, which is in DB saves, and item refund info requests.
7278 RefundableItemsSet::iterator i_next;
7279 for (RefundableItemsSet::iterator itr = m_refundableItems.begin(); itr != m_refundableItems.end(); itr = i_next)
7280 {
7281 // use copy iterator because itr may be invalid after operations in this loop
7282 i_next = itr;
7283 ++i_next;
7284
7285 Item* iPtr = GetItemByGuid((*itr));
7286 if (iPtr)
7287 {
7288 iPtr->UpdatePlayedTime(this);
7289 continue;
7290 }
7291 else
7292 {
7293 LOG_ERROR("entities.player", "Can't find item {} but is in refundable storage for player {} ! Removing.", (*itr).ToString(), GetGUID().ToString());
7294 m_refundableItems.erase(itr);
7295 }
7296 }
7297
7298 // update enchantment durations
7299 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
7300 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
7301
7302 // if no changes
7303 if (m_itemUpdateQueue.empty())
7304 return;
7305
7307 for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
7308 {
7309 Item* item = m_itemUpdateQueue[i];
7310 if (!item)
7311 continue;
7312
7313 Bag* container = item->GetContainer();
7314 ObjectGuid::LowType bag_guid = container ? container->GetGUID().GetCounter() : 0;
7315
7316 if (item->GetState() != ITEM_REMOVED)
7317 {
7318 Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot());
7319 if (!test)
7320 {
7321 ObjectGuid::LowType bagTestGUID = 0;
7322 if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
7323 bagTestGUID = test2->GetGUID().GetCounter();
7324 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
7325 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
7326 // according to the test that was just performed nothing should be in this slot, delete
7327 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
7328 stmt->SetData(0, bagTestGUID);
7329 stmt->SetData(1, item->GetSlot());
7330 stmt->SetData(2, lowGuid);
7331 trans->Append(stmt);
7332
7333 RemoveTradeableItem(item); // pussywizard
7334 RemoveEnchantmentDurationsReferences(item); // pussywizard
7335 RemoveItemDurations(item); // pussywizard
7336
7337 // also THIS item should be somewhere else, cheat attempt
7338 item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue
7340 // don't skip, let the switch delete it
7341 continue;
7342 }
7343 else if (test != item)
7344 {
7345 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
7346 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
7347 // save all changes to the item...
7348 if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
7349 item->SaveToDB(trans);
7350 // ...but do not save position in invntory
7351 continue;
7352 }
7353 }
7354
7355 switch (item->GetState())
7356 {
7357 case ITEM_NEW:
7358 case ITEM_CHANGED:
7359 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
7360 stmt->SetData(0, lowGuid);
7361 stmt->SetData(1, bag_guid);
7362 stmt->SetData (2, item->GetSlot());
7363 stmt->SetData(3, item->GetGUID().GetCounter());
7364 trans->Append(stmt);
7365 break;
7366 case ITEM_REMOVED:
7367 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7368 stmt->SetData(0, item->GetGUID().GetCounter());
7369 trans->Append(stmt);
7370 case ITEM_UNCHANGED:
7371 break;
7372 }
7373
7374 item->SaveToDB(trans); // item have unchanged inventory record and can be save standalone
7375 }
7376 m_itemUpdateQueue.clear();
7377}
@ CHAR_DEL_ITEM_INSTANCE
Definition CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition CharacterDatabase.h:433
@ CHAR_REP_INVENTORY_ITEM
Definition CharacterDatabase.h:123
@ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT
Definition CharacterDatabase.h:434
@ ITEM_FLAG_HAS_LOOT
Definition ItemTemplate.h:149
@ ITEM_CHANGED
Definition Item.h:210
@ ITEM_NEW
Definition Item.h:211
#define sLootItemStorage
Definition LootItemStorage.h:73
@ BUYBACK_SLOT_END
Definition Player.h:730
uint8 GetSlot() const
Definition Item.h:281
Bag * GetContainer()
Definition Item.h:282
ItemUpdateState GetState() const
Definition Item.h:324
void UpdatePlayedTime(Player *owner)
Definition Item.cpp:1218
uint8 GetBagSlot() const
Definition Item.cpp:784
std::vector< Item * > m_itemUpdateQueue
Definition Player.h:2801
void DeleteRefundReference(ObjectGuid itemGUID)
Definition Player.cpp:15549
void RemoveTradeableItem(Item *item)
Definition PlayerStorage.cpp:4139
EnchantDurationList m_enchantDuration
Definition Player.h:2844
void RemoveItemDurations(Item *item)
Definition Player.cpp:12479
void RemoveEnchantmentDurationsReferences(Item *item)
Definition PlayerStorage.cpp:4214
RefundableItemsSet m_refundableItems
Definition Player.h:2944
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:407
bool HasFlag(ItemFlags flag) const
Definition ItemTemplate.h:827

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_REP_INVENTORY_ITEM, CharacterDatabase, DeleteRefundReference(), Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, ITEM_CHANGED, ITEM_FLAG_HAS_LOOT, ITEM_NEW, ITEM_REMOVED, ITEM_UNCHANGED, LOG_ERROR, m_enchantDuration, m_items, m_itemUpdateQueue, m_refundableItems, RemoveEnchantmentDurationsReferences(), RemoveItemDurations(), RemoveTradeableItem(), Item::SaveToDB(), PreparedStatementBase::SetData(), sLootItemStorage, ObjectGuid::ToString(), Position::ToString(), and Item::UpdatePlayedTime().

Referenced by SaveInventoryAndGoldToDB(), and SaveToDB().

◆ _SaveMail()

void Player::_SaveMail ( CharacterDatabaseTransaction  trans)
protected
7380{
7381 if (!GetMailSize() || !m_mailsUpdated)
7382 {
7383 return;
7384 }
7385
7386 CharacterDatabasePreparedStatement* stmt = nullptr;
7387
7388 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7389 {
7390 Mail* m = (*itr);
7391 if (m->state == MAIL_STATE_CHANGED)
7392 {
7393 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7394 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7395 stmt->SetData(1, uint32(m->expire_time));
7396 stmt->SetData(2, uint32(m->deliver_time));
7397 stmt->SetData(3, m->money);
7398 stmt->SetData(4, m->COD);
7399 stmt->SetData(5, uint8(m->checked));
7400 stmt->SetData(6, m->messageID);
7401
7402 trans->Append(stmt);
7403
7404 if (!m->removedItems.empty())
7405 {
7406 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7407 {
7408 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7409 stmt->SetData(0, *itr2);
7410 trans->Append(stmt);
7411 }
7412 m->removedItems.clear();
7413 }
7415 }
7416 else if (m->state == MAIL_STATE_DELETED)
7417 {
7418 if (m->HasItems())
7419 {
7420 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7421 {
7422 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7423 stmt->SetData(0, itr2->item_guid);
7424 trans->Append(stmt);
7425 }
7426 }
7427 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7428 stmt->SetData(0, m->messageID);
7429 trans->Append(stmt);
7430
7431 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7432 stmt->SetData(0, m->messageID);
7433 trans->Append(stmt);
7434 }
7435 }
7436
7437 //deallocate deleted mails...
7438 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7439 {
7440 if ((*itr)->state == MAIL_STATE_DELETED)
7441 {
7442 Mail* m = *itr;
7443 m_mail.erase(itr);
7444 delete m;
7445 itr = m_mail.begin();
7446 }
7447 else
7448 ++itr;
7449 }
7450
7451 m_mailsUpdated = false;
7452}
@ CHAR_UPD_MAIL
Definition CharacterDatabase.h:435
@ CHAR_DEL_MAIL_BY_ID
Definition CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition CharacterDatabase.h:380
@ MAIL_STATE_DELETED
Definition Mail.h:70
@ MAIL_STATE_CHANGED
Definition Mail.h:69
uint32 GetMailSize()
Definition Player.h:1657
bool HasItems() const
Definition Mail.h:206
std::vector< uint32 > removedItems
Definition Mail.h:177
std::vector< MailItemInfo > items
Definition Mail.h:176

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_UPD_MAIL, CharacterDatabase, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, GetMailSize(), Mail::HasItems(), Mail::items, m_mail, m_mailsUpdated, MAIL_STATE_CHANGED, MAIL_STATE_DELETED, MAIL_STATE_UNCHANGED, Mail::messageID, Mail::money, Mail::removedItems, PreparedStatementBase::SetData(), and Mail::state.

Referenced by WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and SaveToDB().

◆ _SaveMonthlyQuestStatus()

void Player::_SaveMonthlyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7617{
7618 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7619 return;
7620
7621 // we don't need transactions here.
7623 stmt->SetData(0, GetGUID().GetCounter());
7624 trans->Append(stmt);
7625
7626 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7627 {
7628 uint32 quest_id = *iter;
7629 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7630 stmt->SetData(0, GetGUID().GetCounter());
7631 stmt->SetData(1, quest_id);
7632 trans->Append(stmt);
7633 }
7634
7635 m_MonthlyQuestChanged = false;
7636}
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition CharacterDatabase.h:76
@ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR
Definition CharacterDatabase.h:61

References CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_MonthlyQuestChanged, m_monthlyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SavePlayerSettings()

void Player::_SavePlayerSettings ( CharacterDatabaseTransaction  trans)
protected
92{
93 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
94 {
95 return;
96 }
97
98 for (auto& itr : m_charSettingsMap)
99 {
100 std::ostringstream data;
101
102 for (auto& setting : itr.second)
103 {
104 data << setting.value << ' ';
105 }
106
108 stmt->SetData(0, GetGUID().GetCounter());
109 stmt->SetData(1, itr.first);
110 stmt->SetData(2, data.str());
111 trans->Append(stmt);
112 }
113}
@ CHAR_REP_CHAR_SETTINGS
Definition CharacterDatabase.h:521

References CHAR_REP_CHAR_SETTINGS, CharacterDatabase, CONFIG_PLAYER_SETTINGS_ENABLED, ObjectGuid::GetCounter(), Object::GetGUID(), m_charSettingsMap, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveQuestStatus()

void Player::_SaveQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7455{
7456 bool isTransaction = static_cast<bool>(trans);
7457 if (!isTransaction)
7458 trans = CharacterDatabase.BeginTransaction();
7459
7460 QuestStatusSaveMap::iterator saveItr;
7461 QuestStatusMap::iterator statusItr;
7462 CharacterDatabasePreparedStatement* stmt = nullptr;
7463
7464 bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS);
7465
7466 for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
7467 {
7468 if (saveItr->second)
7469 {
7470 statusItr = m_QuestStatus.find(saveItr->first);
7471 if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
7472 {
7473 uint8 index = 0;
7474 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
7475
7476 stmt->SetData(index++, GetGUID().GetCounter());
7477 stmt->SetData(index++, statusItr->first);
7478 stmt->SetData(index++, uint8(statusItr->second.Status));
7479 stmt->SetData(index++, statusItr->second.Explored);
7480 stmt->SetData(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS + GameTime::GetGameTime().count()));
7481
7482 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
7483 stmt->SetData(index++, statusItr->second.CreatureOrGOCount[i]);
7484
7485 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
7486 stmt->SetData(index++, statusItr->second.ItemCount[i]);
7487
7488 stmt->SetData(index, statusItr->second.PlayerCount);
7489 trans->Append(stmt);
7490 }
7491 }
7492 else
7493 {
7494 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
7495 stmt->SetData(0, GetGUID().GetCounter());
7496 stmt->SetData(1, saveItr->first);
7497 trans->Append(stmt);
7498 }
7499 }
7500
7501 m_QuestStatusSave.clear();
7502
7503 for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
7504 {
7505 if (saveItr->second)
7506 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
7507 else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
7509
7510 stmt->SetData(0, GetGUID().GetCounter());
7511 stmt->SetData(1, saveItr->first);
7512 trans->Append(stmt);
7513 }
7514
7515 m_RewardedQuestsSave.clear();
7516
7517 if (!isTransaction)
7518 CharacterDatabase.CommitTransaction(trans);
7519}
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition CharacterDatabase.h:439
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition CharacterDatabase.h:437
@ CHAR_REP_CHAR_QUESTSTATUS
Definition CharacterDatabase.h:436
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition CharacterDatabase.h:438
QuestStatusSaveMap m_QuestStatusSave
Definition Player.h:2807
QuestStatusSaveMap m_RewardedQuestsSave
Definition Player.h:2810
@ CLEANING_FLAG_QUESTSTATUS
Definition CharacterDatabaseCleaner.h:31

References CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS, ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, m_QuestStatus, m_QuestStatusSave, m_RewardedQuestsSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_NONE, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveSeasonalQuestStatus()

void Player::_SaveSeasonalQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7583{
7585 {
7586 return;
7587 }
7588
7589 // we don't need transactions here.
7591 stmt->SetData(0, GetGUID().GetCounter());
7592 trans->Append(stmt);
7593
7594 m_SeasonalQuestChanged = false;
7595
7596 if (m_seasonalquests.empty())
7597 {
7598 return;
7599 }
7600
7601 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7602 {
7603 uint16 eventId = iter->first;
7604
7605 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7606 {
7607 uint32 questId = *itr;
7608
7609 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7610 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7611 trans->Append(stmt);
7612 }
7613 }
7614}
@ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS
Definition CharacterDatabase.h:77
@ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR
Definition CharacterDatabase.h:62
void SetArguments(Args &&... args)
Definition PreparedStatement.h:118

References CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_SeasonalQuestChanged, m_seasonalquests, PreparedStatementBase::SetArguments(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSkills()

void Player::_SaveSkills ( CharacterDatabaseTransaction  trans)
7639{
7640 CharacterDatabasePreparedStatement* stmt = nullptr;
7641 // we don't need transactions here.
7642 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7643 {
7644 if (itr->second.uState == SKILL_UNCHANGED)
7645 {
7646 ++itr;
7647 continue;
7648 }
7649
7650 if (itr->second.uState == SKILL_DELETED)
7651 {
7652 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7653 stmt->SetData(0, GetGUID().GetCounter());
7654 stmt->SetData(1, itr->first);
7655 trans->Append(stmt);
7656
7657 mSkillStatus.erase(itr++);
7658 continue;
7659 }
7660
7661 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7662 uint16 value = SKILL_VALUE(valueData);
7663 uint16 max = SKILL_MAX(valueData);
7664
7665 switch (itr->second.uState)
7666 {
7667 case SKILL_NEW:
7668 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7669 stmt->SetData(0, GetGUID().GetCounter());
7670 stmt->SetData(1, uint16(itr->first));
7671 stmt->SetData(2, value);
7672 stmt->SetData(3, max);
7673 trans->Append(stmt);
7674
7675 break;
7676 case SKILL_CHANGED:
7677 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7678 stmt->SetData(0, value);
7679 stmt->SetData(1, max);
7680 stmt->SetData(2, GetGUID().GetCounter());
7681 stmt->SetData(3, uint16(itr->first));
7682 trans->Append(stmt);
7683
7684 break;
7685 default:
7686 break;
7687 }
7688 itr->second.uState = SKILL_UNCHANGED;
7689
7690 ++itr;
7691 }
7692}
@ CHAR_INS_CHAR_SKILLS
Definition CharacterDatabase.h:444
@ CHAR_UDP_CHAR_SKILLS
Definition CharacterDatabase.h:445
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition CharacterDatabase.h:443
#define SKILL_MAX(x)
Definition Player.h:83
#define SKILL_VALUE(x)
Definition Player.h:82
@ SKILL_DELETED
Definition Player.h:647
@ SKILL_CHANGED
Definition Player.h:645
@ SKILL_NEW
Definition Player.h:646

References CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_UNCHANGED, and SKILL_VALUE.

Referenced by SaveToDB().

◆ _SaveSpellCooldowns()

void Player::_SaveSpellCooldowns ( CharacterDatabaseTransaction  trans,
bool  logout 
)
3637{
3639 stmt->SetData(0, GetGUID().GetCounter());
3640 trans->Append(stmt);
3641
3642 time_t curTime = GameTime::GetGameTime().count();
3643 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3644 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3645
3646 bool first_round = true;
3647 std::ostringstream ss;
3648
3649 // remove outdated and save active
3650 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3651 {
3652 // Xinef: dummy cooldown for procs
3653 if (itr->first == uint32(-1))
3654 {
3655 ++itr;
3656 continue;
3657 }
3658
3659 if (itr->second.end <= curMSTime + 1000)
3660 m_spellCooldowns.erase(itr++);
3661 else if (itr->second.end <= infTime && (logout || itr->second.end > (curMSTime + 5 * MINUTE * IN_MILLISECONDS))) // not save locked cooldowns, it will be reset or set at reload
3662 {
3663 if (first_round)
3664 {
3665 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3666 first_round = false;
3667 }
3668 // next new/changed record prefix
3669 else
3670 ss << ',';
3671
3672 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3673 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3674 ++itr;
3675 }
3676 else
3677 ++itr;
3678 }
3679 // if something changed execute
3680 if (!first_round)
3681 trans->Append(ss.str().c_str());
3682}
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition CharacterDatabase.h:404
static constexpr uint32 infinityCooldownDelayCheck
Definition Unit.h:47

References CHAR_DEL_CHAR_SPELL_COOLDOWN, CharacterDatabase, ObjectGuid::GetCounter(), GameTime::GetGameTime(), GameTime::GetGameTimeMS(), Object::GetGUID(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSpells()

void Player::_SaveSpells ( CharacterDatabaseTransaction  trans)
protected
7695{
7696 CharacterDatabasePreparedStatement* stmt = nullptr;
7697
7698 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
7699 {
7700 // xinef: skip temporary spells
7701 if (itr->second->State == PLAYERSPELL_TEMPORARY)
7702 {
7703 ++itr;
7704 continue;
7705 }
7706
7707 // xinef: Delete statement for removed / updated spell
7708 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
7709 {
7710 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
7711 stmt->SetData(0, GetGUID().GetCounter());
7712 stmt->SetData(1, itr->first);
7713 trans->Append(stmt);
7714 }
7715
7716 // xinef: insert statement for new / updated spell
7717 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
7718 {
7719 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
7720 stmt->SetData(0, GetGUID().GetCounter());
7721 stmt->SetData(1, itr->first);
7722 stmt->SetData(2, itr->second->specMask);
7723 trans->Append(stmt);
7724 }
7725
7726 if (itr->second->State == PLAYERSPELL_REMOVED)
7727 {
7728 delete itr->second;
7729 m_spells.erase(itr++);
7730 }
7731 else
7732 {
7733 itr->second->State = PLAYERSPELL_UNCHANGED;
7734 ++itr;
7735 }
7736 }
7737}
@ CHAR_INS_CHAR_SPELL
Definition CharacterDatabase.h:446
@ CHAR_DEL_CHAR_SPELL_BY_SPELL
Definition CharacterDatabase.h:397

References CHAR_DEL_CHAR_SPELL_BY_SPELL, CHAR_INS_CHAR_SPELL, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_spells, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveStats()

void Player::_SaveStats ( CharacterDatabaseTransaction  trans)
protected
7742{
7743 // check if stat saving is enabled and if char level is high enough
7744 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7745 return;
7746
7747 CharacterDatabasePreparedStatement* stmt = nullptr;
7748
7749 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7750 stmt->SetData(0, GetGUID().GetCounter());
7751 trans->Append(stmt);
7752
7753 uint8 index = 0;
7754
7755 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7756 stmt->SetData(index++, GetGUID().GetCounter());
7757 stmt->SetData(index++, GetMaxHealth());
7758
7759 for (uint8 i = 0; i < MAX_POWERS; ++i)
7760 stmt->SetData(index++, GetMaxPower(Powers(i)));
7761
7762 for (uint8 i = 0; i < MAX_STATS; ++i)
7763 stmt->SetData(index++, GetStat(Stats(i)));
7764
7765 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7766 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7767
7776 stmt->SetData(index++, GetBaseSpellPowerBonus());
7778
7779 trans->Append(stmt);
7780}
@ CHAR_DEL_CHAR_STATS
Definition CharacterDatabase.h:447
@ CHAR_INS_CHAR_STATS
Definition CharacterDatabase.h:448
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition IWorld.h:349
#define MAX_STATS
Definition SharedDefines.h:265
SpellSchools
Definition SharedDefines.h:282
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:292
Stats
Definition SharedDefines.h:257
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354
@ PLAYER_FIELD_COMBAT_RATING_1
Definition UpdateFields.h:380
@ PLAYER_PARRY_PERCENTAGE
Definition UpdateFields.h:348
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ PLAYER_DODGE_PERCENTAGE
Definition UpdateFields.h:347
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
float GetFloatValue(uint16 index) const
Definition Object.cpp:317
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1978
uint32 GetResistance(SpellSchoolMask mask) const
Definition Unit.cpp:20399
uint32 GetMaxHealth() const
Definition Unit.h:1039
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1066
float GetStat(Stats stat) const
Definition Unit.h:1004

References CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, CharacterDatabase, CONFIG_MIN_LEVEL_STAT_SAVE, CR_CRIT_TAKEN_SPELL, GetBaseSpellPowerBonus(), Object::GetFloatValue(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), Object::GetUInt32Value(), MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, PreparedStatementBase::SetData(), sWorld, UNIT_FIELD_ATTACK_POWER, and UNIT_FIELD_RANGED_ATTACK_POWER.

Referenced by SaveToDB().

◆ _SaveTalents()

void Player::_SaveTalents ( CharacterDatabaseTransaction  trans)
protected
15062{
15063 CharacterDatabasePreparedStatement* stmt = nullptr;
15064
15065 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
15066 {
15067 // xinef: skip temporary spells
15068 if (itr->second->State == PLAYERSPELL_TEMPORARY)
15069 {
15070 ++itr;
15071 continue;
15072 }
15073
15074 // xinef: delete statement for removed / updated talent
15075 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
15076 {
15077 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
15078 stmt->SetData(0, GetGUID().GetCounter());
15079 stmt->SetData(1, itr->first);
15080 trans->Append(stmt);
15081 }
15082
15083 // xinef: insert statement for new / updated spell
15084 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
15085 {
15086 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
15087 stmt->SetData(0, GetGUID().GetCounter());
15088 stmt->SetData(1, itr->first);
15089 stmt->SetData(2, itr->second->specMask);
15090 trans->Append(stmt);
15091 }
15092
15093 if (itr->second->State == PLAYERSPELL_REMOVED)
15094 {
15095 delete itr->second;
15096 m_talents.erase(itr++);
15097 }
15098 else
15099 {
15100 itr->second->State = PLAYERSPELL_UNCHANGED;
15101 ++itr;
15102 }
15103 }
15104}
@ CHAR_INS_CHAR_TALENT
Definition CharacterDatabase.h:456
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition CharacterDatabase.h:455

References CHAR_DEL_CHAR_TALENT_BY_SPELL, CHAR_INS_CHAR_TALENT, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveWeeklyQuestStatus()

void Player::_SaveWeeklyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7560{
7561 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7562 return;
7563
7564 // we don't need transactions here.
7566 stmt->SetData(0, GetGUID().GetCounter());
7567 trans->Append(stmt);
7568
7569 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7570 {
7571 uint32 quest_id = *iter;
7572
7573 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7574 stmt->SetData(0, GetGUID().GetCounter());
7575 stmt->SetData(1, quest_id);
7576 trans->Append(stmt);
7577 }
7578
7579 m_WeeklyQuestChanged = false;
7580}
@ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR
Definition CharacterDatabase.h:60
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition CharacterDatabase.h:75

References CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_WeeklyQuestChanged, m_weeklyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _StoreItem()

Item * Player::_StoreItem ( uint16  pos,
Item pItem,
uint32  count,
bool  clone,
bool  update 
)
private
2610{
2611 if (!pItem)
2612 return nullptr;
2613
2614 uint8 bag = pos >> 8;
2615 uint8 slot = pos & 255;
2616
2617 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2618
2619 Item* pItem2 = GetItemByPos(bag, slot);
2620
2621 if (!pItem2)
2622 {
2623 if (clone)
2624 pItem = pItem->CloneItem(count, this);
2625 else
2626 pItem->SetCount(count);
2627
2628 if (!pItem)
2629 return nullptr;
2630
2631 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2632 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2633 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2634 pItem->SetBinding(true);
2635
2636 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2637 if (!pBag)
2638 {
2639 m_items[slot] = pItem;
2640 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2643
2644 pItem->SetSlot(slot);
2645 pItem->SetContainer(nullptr);
2646
2647 // need update known currency
2649 AddKnownCurrency(pItem->GetEntry());
2650 }
2651 else
2652 pBag->StoreItem(slot, pItem, update);
2653
2654 if (IsInWorld() && update)
2655 {
2656 pItem->AddToWorld();
2657 pItem->SendUpdateToPlayer(this);
2658 }
2659
2660 pItem->SetState(ITEM_CHANGED, this);
2661 if (pBag)
2662 pBag->SetState(ITEM_CHANGED, this);
2663
2665 AddItemDurations(pItem);
2666
2667 return pItem;
2668 }
2669 else
2670 {
2671 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2672 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2673 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2674 pItem2->SetBinding(true);
2675
2676 pItem2->SetCount(pItem2->GetCount() + count);
2677 if (IsInWorld() && update)
2678 pItem2->SendUpdateToPlayer(this);
2679
2680 if (!clone)
2681 {
2682 // delete item (it not in any slot currently)
2683 if (IsInWorld() && update)
2684 {
2685 pItem->RemoveFromWorld();
2686 pItem->DestroyForPlayer(this);
2687 }
2688
2690 RemoveItemDurations(pItem);
2691
2692 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2693 pItem->SetNotRefundable(this);
2694 pItem->ClearSoulboundTradeable(this);
2695 RemoveTradeableItem(pItem);
2696 pItem->SetState(ITEM_REMOVED, this);
2697 }
2698
2700
2701 pItem2->SetState(ITEM_CHANGED, this);
2702
2703 return pItem2;
2704 }
2705}
@ BIND_WHEN_EQUIPPED
Definition ItemTemplate.h:97
@ BIND_QUEST_ITEM
Definition ItemTemplate.h:99
@ BIND_WHEN_PICKED_UP
Definition ItemTemplate.h:96
@ CURRENCYTOKEN_SLOT_END
Definition Player.h:742
@ CURRENCYTOKEN_SLOT_START
Definition Player.h:741
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition UpdateFields.h:36
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition Item.cpp:714
void SetBinding(bool val)
Definition Item.h:235
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition Item.cpp:1118
void SetCount(uint32 value)
Definition Item.h:273
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition Item.cpp:1200
void SetSlot(uint8 slot)
Definition Item.h:284
uint32 GetCount() const
Definition Item.h:272
void SetOwnerGUID(ObjectGuid guid)
Definition Item.h:232
void SetContainer(Bag *container)
Definition Item.h:286
virtual void DestroyForPlayer(Player *target, bool onDeath=false) const
Definition Object.cpp:274
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:723
virtual void AddToWorld()
Definition Object.cpp:152
virtual void RemoveFromWorld()
Definition Object.cpp:166
void SendUpdateToPlayer(Player *player)
Definition Object.cpp:246
Bag * GetBagByPos(uint8 slot) const
Definition PlayerStorage.cpp:457
void AddEnchantmentDurations(Item *item)
Definition PlayerStorage.cpp:4186
void RemoveEnchantmentDurations(Item *item)
Definition PlayerStorage.cpp:4199
void AddItemDurations(Item *item)
Definition Player.cpp:12491
void AddKnownCurrency(uint32 itemId)
Definition Player.cpp:14249
uint32 Bonding
Definition ItemTemplate.h:663

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, Item::ClearSoulboundTradeable(), Item::CloneItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, Object::DestroyForPlayer(), GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), Object::IsInWorld(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, ITEM_REMOVED, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Item::SetBinding(), Item::SetContainer(), Item::SetCount(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetSlot(), Item::SetState(), Bag::StoreItem(), and ObjectGuid::ToString().

Referenced by StoreItem().

◆ _StoreOrEquipNewItem()

bool Player::_StoreOrEquipNewItem ( uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot,
int32  price,
ItemTemplate const *  pProto,
Creature pVendor,
VendorItem const *  crItem,
bool  bStore 
)
inline
10683{
10684 ItemPosCountVec vDest;
10685 uint16 uiDest = 0;
10686 InventoryResult msg = bStore ?
10687 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10688 CanEquipNewItem(slot, uiDest, item, false);
10689 if (msg != EQUIP_ERR_OK)
10690 {
10691 SendEquipError(msg, nullptr, nullptr, item);
10692 return false;
10693 }
10694
10695 ModifyMoney(-price);
10696
10697 if (crItem->ExtendedCost) // case for new honor system
10698 {
10699 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10700 if (iece->reqhonorpoints)
10701 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10702
10703 if (iece->reqarenapoints)
10704 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10705
10706 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10707 {
10708 if (iece->reqitem[i])
10709 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10710 }
10711 }
10712
10713 sScriptMgr->OnBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10714
10715 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10716 if (it)
10717 {
10718 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10719
10720 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10721 data << pVendor->GetGUID();
10722 data << uint32(vendorslot + 1); // numbered from 1 at client
10723 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10724 data << uint32(count);
10725 GetSession()->SendPacket(&data);
10726 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10727
10728 if (!bStore)
10730
10731 if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10732 {
10734 it->SetRefundRecipient(GetGUID().GetCounter());
10735 it->SetPaidMoney(price);
10736 it->SetPaidExtendedCost(crItem->ExtendedCost);
10737 it->SaveRefundDataToDB();
10739 }
10740 }
10741
10742 sScriptMgr->OnAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10743
10744 return true;
10745}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition DBCStructure.h:1181
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition ItemTemplate.h:159
InventoryResult
Definition Item.h:46
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition Creature.cpp:3114
void SaveRefundDataToDB()
Definition Item.cpp:1172
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:845
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition PlayerStorage.cpp:1791
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11552
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition PlayerStorage.cpp:2707
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition PlayerStorage.cpp:4750
void AutoUnequipOffhandIfNeed(bool force=false)
Definition Player.cpp:12500
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition PlayerStorage.cpp:3121
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition Player.cpp:6305
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition Player.cpp:6321
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition PlayerStorage.cpp:2524
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition PlayerStorage.cpp:4021
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.h:1291
Definition WorldPacket.h:26
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:225
@ SMSG_BUY_ITEM
Definition Opcodes.h:450
Definition DBCStructure.h:1184
uint32 reqarenapoints
Definition DBCStructure.h:1187
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1190
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1189
uint32 reqhonorpoints
Definition DBCStructure.h:1186

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, Object::GetGUID(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), GetSession(), ItemTemplate::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_ITEM_PURCHASE_RECORD, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, VendorItem::maxcount, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, Item::SaveRefundDataToDB(), SendEquipError(), SendNewItem(), WorldSession::SendPacket(), Object::SetFlag(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), sItemExtendedCostStore, SMSG_BUY_ITEM, sScriptMgr, StoreNewItem(), and Creature::UpdateVendorItemCurrentCount().

Referenced by BuyItemFromVendorSlot().

◆ AbandonQuest()

void Player::AbandonQuest ( uint32  quest_id)
931{
932 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
933 {
934 // It will Destroy quest items on quests abandons.
935 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
936 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
937 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
938 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
939
940 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
941 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
942 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
943 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
944 }
945}
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition QuestDef.h:37

References BIND_QUEST_ITEM, DestroyItemCount(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, and sObjectMgr.

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ ActivateSpec()

void Player::ActivateSpec ( uint8  spec)
15107{
15108 // xinef: some basic checks
15109 if (GetActiveSpec() == spec)
15110 return;
15111
15112 if (spec > GetSpecsCount())
15113 return;
15114
15115 // xinef: interrupt currently casted spell just in case
15116 if (IsNonMeleeSpellCast(false))
15118
15119 // xinef: save current actions order
15120 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15121 _SaveActions(trans);
15122 CharacterDatabase.CommitTransaction(trans);
15123
15124 // xinef: remove pet, it will be resummoned later
15125 if (Pet* pet = GetPet())
15127
15128 // xinef: remove other summoned units and clear reactives
15132
15133 // xinef: let client clear his current Actions
15135 uint8 oldSpec = GetActiveSpec();
15136
15137 std::unordered_set<uint32> removedSpecAuras;
15138
15139 // xinef: reset talent auras
15140 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15141 {
15142 if (itr->second->State == PLAYERSPELL_REMOVED)
15143 continue;
15144
15145 // xinef: remove all active talent auras
15146 if (!(itr->second->specMask & GetActiveSpecMask()))
15147 continue;
15148
15149 _removeTalentAurasAndSpells(itr->first);
15150
15151 // pussywizard: was => isn't
15152 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15153 SendLearnPacket(itr->first, false);
15154
15155 removedSpecAuras.insert(itr->first);
15156 }
15157
15158 // xinef: remove glyph auras
15159 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15160 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15161 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15162 {
15163 RemoveAurasDueToSpell(glyphEntry->SpellId);
15164 removedSpecAuras.insert(glyphEntry->SpellId);
15165 }
15166
15167 // xinef: set active spec as new one
15168 SetActiveSpec(spec);
15169 uint32 spentTalents = 0;
15170
15171 // xinef: add talent auras
15172 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15173 {
15174 if (itr->second->State == PLAYERSPELL_REMOVED)
15175 continue;
15176
15177 // xinef: talent not in new spec
15178 if (!(itr->second->specMask & GetActiveSpecMask()))
15179 continue;
15180
15181 // pussywizard: wasn't => is
15182 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15183 SendLearnPacket(itr->first, true);
15184
15185 _addTalentAurasAndSpells(itr->first);
15186 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15187 spentTalents += talentPos->rank + 1;
15188
15189 removedSpecAuras.erase(itr->first);
15190 }
15191
15192 // pussywizard: remove spells that are in previous spec, but are not present in new one (or are in new spec, but not in the old one)
15193 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15194 {
15195 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15196 continue;
15197
15198 // pussywizard: was => isn't
15199 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15200 {
15201 SendLearnPacket(itr->first, false);
15202 // We want to remove all auras of the unlearned spell
15203 _removeTalentAurasAndSpells(itr->first);
15204
15205 removedSpecAuras.insert(itr->first);
15206 }
15207 // pussywizard: wasn't => is
15208 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15209 {
15210 SendLearnPacket(itr->first, true);
15211
15212 removedSpecAuras.erase(itr->first);
15213 }
15214 }
15215
15216 // xinef: apply glyphs from second spec
15217 if (GetActiveSpec() != oldSpec)
15218 {
15219 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15220 {
15221 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15222 if (glyphId)
15223 {
15224 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15225 {
15227 removedSpecAuras.erase(glyphEntry->SpellId);
15228 }
15229 }
15230
15231 SetGlyph(slot, glyphId, true);
15232 }
15233 }
15234
15235 // Remove auras triggered/activated by talents/glyphs
15236 // Mostly explicit casts in dummy aura scripts
15237 if (!removedSpecAuras.empty())
15238 {
15239 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15240 {
15241 Aura* aura = iter->second;
15242 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15243 {
15244 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15245 {
15246 RemoveOwnedAura(iter);
15247 continue;
15248 }
15249 }
15250 ++iter;
15251 }
15252 }
15253
15254 m_usedTalentCount = spentTalents;
15256
15257 // load them asynchronously
15258 {
15260 stmt->SetData(0, GetGUID().GetCounter());
15261 stmt->SetData(1, m_activeSpec);
15262
15263 WorldSession* mySess = GetSession();
15264 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15265 .WithPreparedCallback([mySess](PreparedQueryResult result)
15266 {
15267 // safe callback, we can't pass this pointer directly
15268 // in case player logs out before db response (player would be deleted in that case)
15269 if (Player* thisPlayer = mySess->GetPlayer())
15270 thisPlayer->LoadActions(result);
15271 }));
15272 }
15273
15274 // xinef: reset power
15275 Powers pw = getPowerType();
15276 if (pw != POWER_MANA)
15277 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15278 SetPower(pw, 0);
15279
15280 // xinef: remove titan grip if player had it set and does not have appropriate talent
15281 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15282 SetCanTitanGrip(false);
15283 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15284 if (!HasSpell(674) && m_canDualWield)
15285 SetCanDualWield(false);
15286
15288
15289 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15291 RemoveAurasDueToSpell(25780);
15292
15293 // Xinef: Remove talented single target auras at other targets
15294 AuraList& scAuras = GetSingleCastAuras();
15295 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15296 {
15297 Aura* aura = *iter;
15298 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15299 {
15300 aura->Remove();
15301 iter = scAuras.begin();
15302 }
15303 else
15304 ++iter;
15305 }
15306
15307 sScriptMgr->OnAfterSpecSlotChanged(this, GetActiveSpec());
15308}
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition CharacterDatabase.h:81
@ POWER_MANA
Definition SharedDefines.h:269
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:234
T & AddCallback(T &&query)
Definition AsyncCallbackProcessor.h:34
uint32 GetId() const
Definition SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition SpellAuras.cpp:2761
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
Definition Pet.h:41
void InitTalentForLevel()
Definition Player.cpp:2580
void SetCanTitanGrip(bool value)
Definition Player.cpp:13183
void SetActiveSpec(uint8 spec)
Definition Player.h:1750
Pet * GetPet() const
Definition Player.cpp:8944
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition Player.cpp:3898
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition Player.cpp:9094
void _SaveActions(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7135
uint8 GetActiveSpecMask() const
Definition Player.h:1749
uint8 GetSpecsCount() const
Definition Player.h:1751
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3892
void SendActionButtons(uint32 state) const
Definition Player.cpp:5572
void _addTalentAurasAndSpells(uint32 spellId)
Definition Player.cpp:3035
virtual void SetCanDualWield(bool value)
Definition Unit.h:933
std::list< Aura * > AuraList
Definition Unit.h:653
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4162
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15632
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4132
void ClearAllReactives()
Definition Unit.cpp:16993
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11264
bool m_canDualWield
Definition Unit.h:1988
Powers getPowerType() const
Definition Unit.h:1061
AuraList & GetSingleCastAuras()
Definition Unit.h:1359
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11145
Player session in the World.
Definition WorldSession.h:330
QueryCallbackProcessor & GetQueryProcessor()
Definition WorldSession.h:1087
uint8 rank
Definition DBCStructure.h:2236

References _addTalentAurasAndSpells(), _removeTalentAurasAndSpells(), _SaveActions(), AsyncCallbackProcessor< T >::AddCallback(), AutoUnequipOffhandIfNeed(), Unit::CastSpell(), CHAR_SEL_CHARACTER_ACTIONS_SPEC, CharacterDatabase, CLASS_CONTEXT_ABILITY, CLASS_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), IsClass(), Unit::IsNonMeleeSpellCast(), m_activeSpec, Unit::m_canDualWield, m_canTitanGrip, m_Glyphs, Unit::m_ownedAuras, m_spells, m_talents, m_usedTalentCount, MAX_GLYPH_SLOT_INDEX, PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, POWER_MANA, TalentSpellPos::rank, Aura::Remove(), Unit::RemoveAllControlled(), Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), RemovePet(), SendActionButtons(), SendLearnPacket(), SetActiveSpec(), Unit::SetCanDualWield(), SetCanTitanGrip(), PreparedStatementBase::SetData(), SetGlyph(), Unit::SetPower(), sGlyphPropertiesStore, sScriptMgr, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10271{
10272 if (nodes.size() < 2)
10273 return false;
10274
10275 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10277 {
10279 return false;
10280 }
10281
10283 return false;
10284
10285 // taximaster case
10286 if (npc)
10287 {
10288 // not let cheating with start flight mounted
10289 if (IsMounted())
10290 {
10292 return false;
10293 }
10294
10296 {
10298 return false;
10299 }
10300
10301 // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
10302 if (IsNonMeleeSpellCast(false))
10303 {
10305 return false;
10306 }
10307 }
10308 // cast case or scripted call case
10309 else
10310 {
10312
10315
10317 if (spell->m_spellInfo->Id != spellid)
10319
10321
10323 if (spell->m_spellInfo->Id != spellid)
10325 }
10326
10327 uint32 sourcenode = nodes[0];
10328
10329 // starting node too far away (cheat?)
10330 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10331 if (!node)
10332 {
10334 return false;
10335 }
10336
10337 // Prepare to flight start now
10338
10339 // stop combat at start taxi flight if any
10340 CombatStop();
10341
10344 ExitVehicle();
10345
10346 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10347 TradeCancel(true);
10348
10349 // clean not finished taxi path if any
10351
10352 // 0 element current node
10353 m_taxi.AddTaxiDestination(sourcenode);
10354
10355 // fill destinations path tail
10356 uint32 sourcepath = 0;
10357 uint32 totalcost = 0;
10358 uint32 firstcost = 0;
10359
10360 uint32 prevnode = sourcenode;
10361 uint32 lastnode = 0;
10362
10363 for (uint32 i = 1; i < nodes.size(); ++i)
10364 {
10365 uint32 path, cost;
10366
10367 lastnode = nodes[i];
10368 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10369
10370 if (!path)
10371 {
10373 return false;
10374 }
10375
10376 totalcost += cost;
10377 if (i == 1)
10378 firstcost = cost;
10379
10380 if (prevnode == sourcenode)
10381 sourcepath = path;
10382
10383 m_taxi.AddTaxiDestination(lastnode);
10384
10385 prevnode = lastnode;
10386 }
10387
10388 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10389 //
10390 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10391 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10392 // change but I couldn't find a suitable alternative. OK to use class because only DK
10393 // can use this taxi.
10394 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
10395
10396 // in spell case allow 0 model
10397 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10398 {
10401 return false;
10402 }
10403
10404 uint32 money = GetMoney();
10405
10406 if (npc)
10407 {
10408 float discount = GetReputationPriceDiscount(npc);
10409 totalcost = uint32(ceil(totalcost * discount));
10410 firstcost = uint32(ceil(firstcost * discount));
10412 }
10413 else
10414 {
10416 }
10417
10418 if (money < totalcost)
10419 {
10422 return false;
10423 }
10424
10425 //Checks and preparations done, DO FLIGHT
10427
10428 // prevent stealth flight
10429 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10430
10431 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10432 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10433 {
10434 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10436 ModifyMoney(-(int32)totalcost);
10438 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10439 return false;
10440 }
10441 else
10442 {
10443 m_flightSpellActivated = spellid;
10444 ModifyMoney(-(int32)firstcost);
10447 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10448 }
10449 return true;
10450}
npc
Definition BattlegroundSA.h:75
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition DBCEnums.h:176
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ CONFIG_INSTANT_TAXI
Definition IWorld.h:383
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ ERR_TAXIPLAYERBUSY
Definition SharedDefines.h:3602
@ ERR_TAXIOK
Definition SharedDefines.h:3595
@ ERR_TAXINOSUCHPATH
Definition SharedDefines.h:3597
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition SharedDefines.h:3596
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition SharedDefines.h:3604
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition SharedDefines.h:3603
@ ERR_TAXINOTENOUGHMONEY
Definition SharedDefines.h:3598
@ SPELL_AURA_MOD_SHAPESHIFT
Definition SpellAuraDefines.h:99
@ CLASS_CONTEXT_TAXI
Definition UnitDefines.h:231
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:252
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition Unit.h:538
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:540
void AddTaxiDestination(uint32 dest)
Definition PlayerTaxi.h:62
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition PlayerTaxi.h:75
void ClearTaxiDestinations()
Definition PlayerTaxi.h:61
TeamId GetTeamId(bool original=false) const
Definition Player.h:2116
float GetReputationPriceDiscount(Creature const *creature) const
Definition Player.cpp:12373
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1334
void TradeCancel(bool sendback)
Definition PlayerStorage.cpp:4088
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9331
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13196
Definition Spell.h:287
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4093
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10495
bool IsInDisallowedMountForm() const
Definition Unit.cpp:21333
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:718
bool IsMounted() const
Definition Unit.h:1800
bool HasUnitState(const uint32 f) const
Definition Unit.h:707
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5143
bool IsInCombat() const
Definition Unit.h:893
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19801
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1502
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition TaxiHandler.cpp:279
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition TaxiHandler.cpp:109
Definition DBCStructure.h:1952
float z
Definition DBCStructure.h:1957
uint32 map_id
Definition DBCStructure.h:1954
float x
Definition DBCStructure.h:1955
float y
Definition DBCStructure.h:1956

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), CLASS_CONTEXT_TAXI, CLASS_DEATH_KNIGHT, PlayerTaxi::ClearTaxiDestinations(), Unit::CombatStop(), CONFIG_INSTANT_TAXI, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, ERR_TAXINOSUCHPATH, ERR_TAXINOTENOUGHMONEY, ERR_TAXIOK, ERR_TAXIPLAYERALREADYMOUNTED, ERR_TAXIPLAYERBUSY, ERR_TAXIPLAYERSHAPESHIFTED, ERR_TAXIUNSPECIFIEDSERVERERROR, Unit::ExitVehicle(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), IsClass(), Unit::IsInCombat(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), m_flightSpellActivated, m_isInstantFlightOn, m_taxi, TaxiNodesEntry::map_id, ModifyMoney(), Unit::RemoveAurasByType(), WorldSession::SendActivateTaxiReply(), WorldSession::SendDoFlight(), PlayerTaxi::SetFlightMasterFactionTemplateId(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiNodesStore, StopCastingBindSight(), StopCastingCharm(), sWorld, TeleportTo(), TradeCancel(), UNIT_FLAG_DISABLE_MOVE, UNIT_STATE_ROOT, UNIT_STATE_STUNNED, UpdateAchievementCriteria(), TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

Referenced by ActivateTaxiPathTo(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), Aura::HandleAuraSpecificMods(), OPvPCapturePointNA::HandleCustomSpell(), npc_taxi::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), and npc_karynaku::OnQuestAccept().

◆ ActivateTaxiPathTo() [2/2]

bool Player::ActivateTaxiPathTo ( uint32  taxi_path_id,
uint32  spellid = 1 
)
10453{
10454 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10455 if (!entry)
10456 return false;
10457
10458 std::vector<uint32> nodes;
10459
10460 nodes.resize(2);
10461 nodes[0] = entry->from;
10462 nodes[1] = entry->to;
10463
10464 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10465}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition Player.cpp:10270
Definition DBCStructure.h:1964
uint32 to
Definition DBCStructure.h:1967
uint32 from
Definition DBCStructure.h:1966

References ActivateTaxiPathTo(), TaxiPathEntry::from, sTaxiPathStore, and TaxiPathEntry::to.

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5644{
5645 if (!IsActionButtonDataValid(button, action, type))
5646 return nullptr;
5647
5648 // it create new button (NEW state) if need or return existed
5649 ActionButton& ab = m_actionButtons[button];
5650
5651 // set data and update to CHANGED if not NEW
5652 ab.SetActionAndType(action, ActionButtonType(type));
5653
5654 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5655 return &ab;
5656}
ActionButtonType
Definition Player.h:228
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition Player.cpp:5600
void SetActionAndType(uint32 action, ActionButtonType type)
Definition Player.h:267

References Object::GetGUID(), IsActionButtonDataValid(), LOG_DEBUG, m_actionButtons, ActionButton::SetActionAndType(), and Position::ToString().

Referenced by _LoadActions(), Create(), and WorldSession::HandleSetActionButtonOpcode().

◆ AddArmorProficiency()

void Player::AddArmorProficiency ( uint32  newflag)
inline
1370{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12282{
12283 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12284 {
12285 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12286 {
12287 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12288 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12289 return i;
12290 }
12291 }
12292
12294}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ AddBonusTalent()

void Player::AddBonusTalent ( uint32  count)
inline
1743{ m_extraBonusTalentCount += count; };

References m_extraBonusTalentCount.

◆ AddEnchantmentDuration()

void Player::AddEnchantmentDuration ( Item item,
EnchantmentSlot  slot,
uint32  duration 
)
4275{
4276 if (!item)
4277 return;
4278
4279 if (slot >= MAX_ENCHANTMENT_SLOT)
4280 return;
4281
4282 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4283 {
4284 if (itr->item == item && itr->slot == slot)
4285 {
4286 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4287 m_enchantDuration.erase(itr);
4288 break;
4289 }
4290 }
4291 if (item && duration > 0)
4292 {
4293 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4294 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4295 }
4296}
@ MAX_ENCHANTMENT_SLOT
Definition Item.h:183
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition ItemHandler.cpp:1232
Definition Player.h:446

References Object::GetGUID(), Object::GetGUID(), GetSession(), m_enchantDuration, MAX_ENCHANTMENT_SLOT, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4187{
4188 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4189 {
4190 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4191 continue;
4192
4193 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4194 if (duration > 0)
4195 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4196 }
4197}
EnchantmentSlot
Definition Item.h:168
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition Item.h:305
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition PlayerStorage.cpp:4274

References AddEnchantmentDuration(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), and MAX_ENCHANTMENT_SLOT.

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddInstanceEnterTime()

void Player::AddInstanceEnterTime ( uint32  instanceId,
time_t  enterTime 
)
inline
2459 {
2460 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2461 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2462 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15597{
15598 uint32 noSpaceForCount = 0;
15599 ItemPosCountVec dest;
15600 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15601 if (msg != EQUIP_ERR_OK)
15602 count -= noSpaceForCount;
15603
15604 if (count == 0 || dest.empty())
15605 {
15606 // -- TODO: Send to mailbox if no space
15607 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15608 return false;
15609 }
15610
15611 Item* item = StoreNewItem(dest, itemId, true);
15612 if (item)
15613 SendNewItem(item, count, true, false);
15614 else
15615 return false;
15616 return true;
15617}
@ NULL_BAG
Definition Item.h:40
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:210

References CanStoreNewItem(), EQUIP_ERR_OK, GetSession(), NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), SendNewItem(), and StoreNewItem().

Referenced by spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), spell_q9452_cast_net::HandleDummy(), spell_catch_the_wild_wolpertinger::HandleEffectApply(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12492{
12494 {
12495 m_itemDuration.push_back(item);
12496 item->SendTimeUpdate(this);
12497 }
12498}
@ ITEM_FIELD_DURATION
Definition UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition Item.cpp:1075
ItemDurationList m_itemDuration
Definition Player.h:2845

References Object::GetUInt32Value(), ITEM_FIELD_DURATION, m_itemDuration, and Item::SendTimeUpdate().

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddItemToBuyBackSlot()

void Player::AddItemToBuyBackSlot ( Item pItem,
uint32  money 
)
3937{
3938 if (pItem)
3939 {
3941 // if current back slot non-empty search oldest or free
3942 if (m_items[slot])
3943 {
3945 uint32 oldest_slot = BUYBACK_SLOT_START;
3946
3947 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3948 {
3949 // found empty
3950 if (!m_items[i])
3951 {
3952 slot = i;
3953 break;
3954 }
3955
3957
3958 if (oldest_time > i_time)
3959 {
3960 oldest_time = i_time;
3961 oldest_slot = i;
3962 }
3963 }
3964
3965 // find oldest
3966 slot = oldest_slot;
3967 }
3968
3969 RemoveItemFromBuyBackSlot(slot, true);
3970 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3971
3972 m_items[slot] = pItem;
3973 time_t base = GameTime::GetGameTime().count();
3974 uint32 etime = uint32(base - m_logintime + (30 * 3600));
3975 uint32 eslot = slot - BUYBACK_SLOT_START;
3976
3980
3981 // move to next (for non filled list is move most optimized choice)
3984 }
3985}
@ PLAYER_FIELD_BUYBACK_PRICE_1
Definition UpdateFields.h:372
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
Definition UpdateFields.h:331
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
Definition UpdateFields.h:373
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
Definition PlayerStorage.cpp:3995

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetUInt32Value(), LOG_DEBUG, m_currentBuybackSlot, m_items, m_logintime, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, RemoveItemFromBuyBackSlot(), Object::SetGuidValue(), and Unit::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

void Player::AddKnownCurrency ( uint32  itemId)
private
14250{
14251 if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
14252 SetFlag64(PLAYER_FIELD_KNOWN_CURRENCIES, (1LL << (ctEntry->BitIndex - 1)));
14253}
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
void SetFlag64(uint16 index, uint64 newFlag)
Definition Object.cpp:956
Definition DBCStructure.h:834

References PLAYER_FIELD_KNOWN_CURRENCIES, sCurrencyTypesStore, and Object::SetFlag64().

Referenced by _StoreItem(), SetArenaPoints(), and SetHonorPoints().

◆ AddMail()

void Player::AddMail ( Mail mail)
inline
1656{ m_mail.push_front(mail); }// for call from WorldSession::SendMailTo

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1682 {
1683 ASSERT(it);
1684 //ASSERT deleted, because items can be added before loading
1685 mMitems[it->GetGUID().GetCounter()] = it;
1686 }

References ASSERT, ObjectGuid::GetCounter(), Object::GetGUID(), and mMitems.

Referenced by _LoadMailedItem(), and MailDraft::SendMailTo().

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2905{
2906 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2907 {
2908 ++unReadMails;
2909 SendNewMail();
2910 }
2911 else // not ready and no have ready mails
2912 {
2913 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2914 m_nextMailDelivereTime = deliver_time;
2915 }
2916}
void SendNewMail()
Definition Player.cpp:2896

References GameTime::GetGameTime(), m_nextMailDelivereTime, SendNewMail(), and unReadMails.

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
508{
509 uint16 log_slot = FindQuestSlot(0);
510
511 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
512 return;
513
514 uint32 quest_id = quest->GetQuestId();
515
516 // if not exist then created with set uState == NEW and rewarded=false
517 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
518
519 // check for repeatable quests status reset
520 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
521 questStatusData.Explored = false;
522
523 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
524 {
525 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
526 questStatusData.ItemCount[i] = 0;
527 }
528
530 {
531 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
532 questStatusData.CreatureOrGOCount[i] = 0;
533 }
534
535 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
536 questStatusData.PlayerCount = 0;
537
538 GiveQuestSourceItem(quest);
539 AdjustQuestReqItemCount(quest, questStatusData);
540
541 if (quest->GetRepObjectiveFaction())
542 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
543 GetReputationMgr().SetVisible(factionEntry);
544
545 if (quest->GetRepObjectiveFaction2())
546 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
547 GetReputationMgr().SetVisible(factionEntry);
548
549 uint32 qtime = 0;
550 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
551 {
552 uint32 timeAllowed = quest->GetTimeAllowed();
553
554 // shared timed quest
555 if (questGiver && questGiver->IsPlayer())
556 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
557
558 AddTimedQuest(quest_id);
559 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
560 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
561 }
562 else
563 questStatusData.Timer = 0;
564
565 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
566 {
567 pvpInfo.IsHostile = true;
569 }
570
571 SetQuestSlot(log_slot, quest_id, qtime);
572
573 m_QuestStatusSave[quest_id] = true;
574
576
577 SendQuestUpdate(quest_id);
578
579 // check if Quest Tracker is enabled
580 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
581 {
582 // prepare Quest Tracker datas
583 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
584 stmt->SetData(0, quest_id);
585 stmt->SetData(1, GetGUID().GetCounter());
586 stmt->SetData(2, GitRevision::GetHash());
587 stmt->SetData(3, GitRevision::GetDate());
588
589 // add to Quest Tracker
590 CharacterDatabase.Execute(stmt);
591 }
592
593 // Xinef: area auras may change on quest accept!
596}
@ CHAR_INS_QUEST_TRACK
Definition CharacterDatabase.h:501
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition DBCEnums.h:111
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition IWorld.h:147
@ QUEST_FLAGS_FLAGS_PVP
Definition QuestDef.h:145
@ QUEST_SPECIAL_FLAGS_CAST
Definition QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_KILL
Definition QuestDef.h:177
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition QuestDef.h:179
bool IsPlayer() const
Definition Object.h:200
Player * ToPlayer()
Definition Object.h:201
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition Player.cpp:13961
QuestStatusMap & getQuestStatusMap()
Definition Player.h:1634
uint16 FindQuestSlot(uint32 quest_id) const
Definition PlayerQuest.cpp:1782
void UpdatePvPState()
Definition PlayerUpdates.cpp:1432
void UpdateAreaDependentAuras(uint32 area_id)
Definition PlayerUpdates.cpp:1859
void SendQuestUpdate(uint32 questId)
Definition PlayerQuest.cpp:1526
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition PlayerQuest.cpp:1764
PvPInfo pvpInfo
Definition Player.h:1854
void UpdateZoneDependentAuras(uint32 zone_id)
Definition PlayerUpdates.cpp:1845
bool GiveQuestSourceItem(Quest const *quest)
Definition PlayerQuest.cpp:1335
ReputationMgr & GetReputationMgr()
Definition Player.h:2133
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition ReputationMgr.cpp:458
uint32 GetAreaId() const
Definition Object.cpp:3167
AC_COMMON_API char const * GetDate()
Definition GitRevision.cpp:26
AC_COMMON_API char const * GetHash()
Definition GitRevision.cpp:21
Definition DBCStructure.h:906
bool IsHostile
Definition Player.h:365

References ACHIEVEMENT_TIMED_TYPE_QUEST, AddTimedQuest(), AdjustQuestReqItemCount(), CHAR_INS_QUEST_TRACK, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, FindQuestSlot(), WorldObject::GetAreaId(), GitRevision::GetDate(), GameTime::GetGameTime(), Object::GetGUID(), GitRevision::GetHash(), Quest::GetQuestId(), getQuestStatusMap(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), GetReputationMgr(), Quest::GetTimeAllowed(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, Object::IsPlayer(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QuestStatusData::PlayerCount, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, SendQuestUpdate(), SetQuestSlot(), ReputationMgr::SetVisible(), sFactionStore, StartTimedAchievement(), QuestStatusData::Status, sWorld, QuestStatusData::Timer, Object::ToPlayer(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

void Player::AddQuestAndCheckCompletion ( Quest const *  quest,
Object questGiver 
)
422{
423 AddQuest(quest, questGiver);
424
425 if (CanCompleteQuest(quest->GetQuestId()))
426 CompleteQuest(quest->GetQuestId());
427
428 if (!questGiver)
429 return;
430
431 switch (questGiver->GetTypeId())
432 {
433 case TYPEID_UNIT:
434 sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
435 questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
436 break;
437 case TYPEID_ITEM:
438 case TYPEID_CONTAINER:
439 {
440 Item* item = (Item*)questGiver;
441 sScriptMgr->OnQuestAccept(this, item, quest);
442
443 // destroy not required for quest finish quest starting item
444 bool destroyItem = true;
445 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
446 {
447 if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
448 {
449 destroyItem = false;
450 break;
451 }
452 }
453
454 if (destroyItem)
455 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
456
457 break;
458 }
460 sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
461 questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
462 break;
463 default:
464 break;
465 }
466}
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEID_ITEM
Definition ObjectGuid.h:33
@ TYPEID_CONTAINER
Definition ObjectGuid.h:34
CreatureAI * AI() const
Definition Creature.h:140
virtual bool QuestAccept(Player *, Quest const *)
Definition GameObjectAI.h:57
GameObjectAI * AI() const
Definition GameObject.h:305
TypeID GetTypeId() const
Definition Object.h:127
GameObject * ToGameObject()
Definition Object.h:213
Creature * ToCreature()
Definition Object.h:205
void AddQuest(Quest const *quest, Object *questGiver)
Definition PlayerQuest.cpp:507
void CompleteQuest(uint32 quest_id)
Definition PlayerQuest.cpp:598
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition PlayerStorage.cpp:3023
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition PlayerQuest.cpp:289
virtual void sQuestAccept(Player *, Quest const *)
Definition UnitAI.h:416
int32 MaxCount
Definition ItemTemplate.h:644

References AddQuest(), Creature::AI(), GameObject::AI(), CanCompleteQuest(), CompleteQuest(), DestroyItem(), Item::GetBagSlot(), Object::GetEntry(), Quest::GetQuestId(), Item::GetSlot(), Item::GetTemplate(), Object::GetTypeId(), ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, GameObjectAI::QuestAccept(), Quest::RequiredItemId, UnitAI::sQuestAccept(), sScriptMgr, Object::ToCreature(), Object::ToGameObject(), TYPEID_CONTAINER, TYPEID_GAMEOBJECT, TYPEID_ITEM, and TYPEID_UNIT.

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ AddReceivedSpectatorResetFor()

void Player::AddReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2593{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition Player.h:2597

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15545{
15546 m_refundableItems.insert(itemGUID);
15547}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

void Player::AddRuneByAuraEffect ( uint8  index,
RuneType  newType,
AuraEffect const *  aura 
)
inline
2527{ SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
void ConvertRune(uint8 index, RuneType newType)
Definition Player.cpp:13457
void SetRuneConvertAura(uint8 index, AuraEffect const *aura)
Definition Player.h:2526

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13480{
13482 data << uint32(1 << index); // mask (0x00-0x3F probably)
13483 GetSession()->SendPacket(&data);
13484}
@ SMSG_ADD_RUNE_POWER
Definition Opcodes.h:1190

References GetSession(), WorldSession::SendPacket(), and SMSG_ADD_RUNE_POWER.

◆ addSpell()

bool Player::addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  updateActive,
bool  temporary = false,
bool  learnFromSkill = false 
)
3070{
3071 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
3072 return false;
3073
3074 if (!updateActive)
3075 return true;
3076
3077 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3078
3079 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3080 // pussywizard: assumption - it's in all specs, can't be a talent
3081 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3082 {
3083 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3084 while (nextSpellInfo)
3085 {
3086 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3087 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3088 {
3089 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3090 {
3091 itr->second->Active = false;
3092 if (IsInWorld())
3093 {
3095 data << uint32(nextSpellInfo->Id);
3096 data << uint32(spellInfo->Id);
3097 GetSession()->SendPacket(&data);
3098 }
3099 return false;
3100 }
3101 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3102 {
3103 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3104 if (itr2 != m_spells.end())
3105 itr2->second->Active = false;
3106 return false;
3107 }
3108 }
3109 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3110 }
3111 }
3112
3113 return true;
3114}
uint8 GetRank() const
Definition SpellInfo.cpp:2494
bool IsRanked() const
Definition SpellInfo.cpp:2489
bool IsStackableWithRanks() const
Definition SpellInfo.cpp:1145
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2513
@ SMSG_SUPERCEDED_SPELL
Definition Opcodes.h:330

References _addSpell(), SpellInfo::GetNextRankSpell(), SpellInfo::GetRank(), GetSession(), SpellInfo::Id, Object::IsInWorld(), SpellInfo::IsRanked(), SpellInfo::IsStackableWithRanks(), m_spells, PLAYERSPELL_REMOVED, WorldSession::SendPacket(), SMSG_SUPERCEDED_SPELL, and sSpellMgr.

Referenced by _LoadSpells(), LearnCustomSpells(), learnSkillRewardedSpells(), and learnSpell().

◆ AddSpellAndCategoryCooldowns()

void Player::AddSpellAndCategoryCooldowns ( SpellInfo const *  spellInfo,
uint32  itemId,
Spell spell = nullptr,
bool  infinityCooldown = false 
)
10948{
10949 // init cooldown values
10950 uint32 cat = 0;
10951 int32 rec = -1;
10952 int32 catrec = -1;
10953
10954 // some special item spells without correct cooldown in SpellInfo
10955 // cooldown information stored in item prototype
10956 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10957
10958 if (itemId)
10959 {
10960 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10961 {
10962 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10963 {
10964 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10965 {
10966 cat = proto->Spells[idx].SpellCategory;
10967 rec = proto->Spells[idx].SpellCooldown;
10968 catrec = proto->Spells[idx].SpellCategoryCooldown;
10969 break;
10970 }
10971 }
10972 }
10973 }
10974
10975 // if no cooldown found above then base at DBC data
10976 if (rec < 0 && catrec < 0)
10977 {
10978 cat = spellInfo->GetCategory();
10979 rec = spellInfo->RecoveryTime;
10980 catrec = spellInfo->CategoryRecoveryTime;
10981 }
10982
10983 time_t catrecTime;
10984 time_t recTime;
10985
10986 bool needsCooldownPacket = false;
10987
10988 // overwrite time for selected category
10989 if (infinityCooldown)
10990 {
10991 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10992 // but not allow ignore until reset or re-login
10993 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10994 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10995 }
10996 else
10997 {
10998 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10999 // prevent 0 cooldowns set by another way
11000 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
11002
11003 // Now we have cooldown data (if found any), time to apply mods
11004 if (rec > 0)
11005 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
11006
11007 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
11008 {
11009 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
11010 }
11011
11013 {
11014 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
11015 if (HasSpell(spellInfo->Id))
11016 {
11017 needsCooldownPacket = true;
11018 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
11019 }
11020 }
11021
11022 // replace negative cooldowns by 0
11023 if (rec < 0) rec = 0;
11024 if (catrec < 0) catrec = 0;
11025
11026 // no cooldown after applying spell mods
11027 if (rec == 0 && catrec == 0)
11028 return;
11029
11030 catrecTime = catrec ? catrec : 0;
11031 recTime = rec ? rec : catrecTime;
11032 }
11033
11034 // category spells
11035 if (cat && catrec > 0)
11036 {
11037 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11038 if (needsCooldownPacket)
11039 {
11040 WorldPacket data;
11041 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
11042 SendDirectMessage(&data);
11043 }
11044
11045 PacketCooldowns forcedCategoryCooldowns;
11046
11047 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
11048 if (i_scstore != sSpellsByCategoryStore.end())
11049 {
11050 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
11051 {
11052 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
11053 {
11054 continue;
11055 }
11056
11057 // If spell category is applied by item, then other spells should be exists in item templates
11058 if ((itemId > 0) != i_scset->first)
11059 {
11060 continue;
11061 }
11062
11063 // Only within the same spellfamily
11064 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
11065 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
11066 {
11067 continue;
11068 }
11069
11070 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
11071
11072 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
11073 {
11074 forcedCategoryCooldowns[i_scset->second] = catrecTime;
11075 }
11076 }
11077 }
11078
11079 if (!forcedCategoryCooldowns.empty())
11080 {
11081 WorldPacket data;
11082 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
11083 SendDirectMessage(&data);
11084 }
11085 }
11086 else
11087 {
11088 // self spell cooldown
11089 if (recTime > 0)
11090 {
11091 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11092
11093 if (needsCooldownPacket)
11094 {
11095 WorldPacket data;
11096 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
11097 SendDirectMessage(&data);
11098 }
11099 }
11100 }
11101}
SpellCategoryStore sSpellsByCategoryStore
Definition DBCStores.cpp:152
#define MAX_ITEM_SPELLS
Definition Item.h:215
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition SharedDefines.h:635
@ SPELL_AURA_MOD_COOLDOWN
Definition SpellAuraDefines.h:259
@ SPELLMOD_COOLDOWN
Definition SpellDefines.h:87
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition SpellInfo.h:204
static constexpr uint32 infinityCooldownDelay
Definition Unit.h:46
@ SPELL_COOLDOWN_FLAG_NONE
Definition Unit.h:622
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition Unit.h:627
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5726
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition Player.cpp:9766
uint32 SpellFamilyName
Definition SpellInfo.h:387
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition Unit.cpp:21051
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:873
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:5966

References _AddSpellCooldown(), ApplySpellMod(), Unit::BuildCooldownPacket(), SpellInfo::CategoryRecoveryTime, Unit::GetAttackTime(), SpellInfo::GetCategory(), Unit::GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasSpell(), SpellInfo::Id, IN_MILLISECONDS, infinityCooldownDelay, SpellInfo::IsAutoRepeatRangedSpell(), SpellInfo::IsCooldownStartedOnEvent(), MAX_ITEM_SPELLS, RANGED_ATTACK, SpellInfo::RecoveryTime, SendDirectMessage(), sObjectMgr, SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS, SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS, SPELL_AURA_MOD_COOLDOWN, SPELL_COOLDOWN_FLAG_NONE, SpellInfo::SpellFamilyName, SPELLMOD_COOLDOWN, sSpellMgr, and sSpellsByCategoryStore.

Referenced by Aura::_ApplyForTarget(), Unit::AddGameObject(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), SendCooldownEvent(), Spell::SendSpellCooldown(), and Unit::SetMinion().

◆ AddSpellCooldown()

void Player::AddSpellCooldown ( uint32  spell_id,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
overridevirtual

◆ AddSpellMod()

void Player::AddSpellMod ( SpellModifier mod,
bool  apply 
)
9925{
9926 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9928
9929 int i = 0;
9930 flag96 _mask = 0;
9931 for (int eff = 0; eff < 96; ++eff)
9932 {
9933 if (eff != 0 && eff % 32 == 0)
9934 _mask[i++] = 0;
9935
9936 _mask[i] = uint32(1) << (eff - (32 * i));
9937 if (mod->mask & _mask)
9938 {
9939 int32 val = 0;
9940 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9941 {
9942 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9943 val += (*itr)->value;
9944 }
9945 val += apply ? mod->value : -(mod->value);
9946 WorldPacket data(Opcode, (1 + 1 + 4));
9947 data << uint8(eff);
9948 data << uint8(mod->op);
9949 data << int32(val);
9950 SendDirectMessage(&data);
9951 }
9952 }
9953
9954 if (apply)
9955 {
9956 m_spellMods[mod->op].push_back(mod);
9958 m_spellMods[mod->op].sort(MageSpellModPred());
9959 else
9960 m_spellMods[mod->op].sort(SpellModPred());
9961 }
9962 else
9963 {
9964 m_spellMods[mod->op].remove(mod);
9965 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9966 if (!mod->ownerAura)
9967 delete mod;
9968 }
9969}
@ SPELLMOD_FLAT
Definition Player.h:93
@ CLASS_MAGE
Definition SharedDefines.h:148
Definition Player.cpp:9909
SpellModList m_spellMods[MAX_SPELLMOD]
Definition Player.h:2840
Definition Player.cpp:9898
Definition Util.h:451
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition Opcodes.h:644
@ SMSG_SET_PCT_SPELL_MODIFIER
Definition Opcodes.h:645
void apply(T *val)
Definition ByteConverter.h:40
SpellModOp op
Definition Player.h:183
SpellModType type
Definition Player.h:184
int32 value
Definition Player.h:186
uint32 spellId
Definition Player.h:188
Aura *const ownerAura
Definition Player.h:189
flag96 mask
Definition Player.h:187

References CLASS_CONTEXT_ABILITY, CLASS_MAGE, IsClass(), LOG_DEBUG, m_spellMods, SpellModifier::mask, SpellModifier::op, SpellModifier::ownerAura, SendDirectMessage(), SMSG_SET_FLAT_SPELL_MODIFIER, SMSG_SET_PCT_SPELL_MODIFIER, SpellModifier::spellId, SPELLMOD_FLAT, SpellModifier::type, and SpellModifier::value.

Referenced by AuraEffect::ApplySpellMod().

◆ addTalent()

bool Player::addTalent ( uint32  spellId,
uint8  addSpecMask,
uint8  oldTalentRank 
)
2919{
2920 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2921 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2922 return false;
2923
2924 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2925 if (!talentPos)
2926 return false;
2927
2928 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2929 if (!talentInfo)
2930 return false;
2931
2932 // xinef: remove old talent rank if any
2933 if (oldTalentRank)
2934 {
2935 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2936 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2937 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2938 }
2939
2940 // xinef: add talent auras and spells
2941 if (GetActiveSpecMask() & addSpecMask)
2942 _addTalentAurasAndSpells(spellId);
2943
2944 // xinef: find the spell on our talent map
2945 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2946
2947 // xinef: we do not have such a spell on our talent map
2948 if (itr == m_talents.end())
2949 {
2951 PlayerTalent* newTalent = new PlayerTalent();
2952 newTalent->State = state;
2953 newTalent->specMask = addSpecMask;
2954 newTalent->talentID = talentInfo->TalentID;
2955 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2956 m_talents[spellId] = newTalent;
2957
2958 if (GetActiveSpecMask() & addSpecMask)
2959 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2960
2961 return true;
2962 }
2963 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2964 else if (!(itr->second->specMask & addSpecMask))
2965 {
2966 itr->second->specMask |= addSpecMask;
2967 if (itr->second->State != PLAYERSPELL_NEW)
2968 itr->second->State = PLAYERSPELL_CHANGED;
2969
2970 if (GetActiveSpecMask() & addSpecMask)
2971 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2972
2973 return true;
2974 }
2975
2976 return false;
2977}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition Player.h:118
Definition Player.h:135
PlayerSpellState State
Definition Player.h:136
bool inSpellBook
Definition Player.h:139
uint32 talentID
Definition Player.h:138
uint8 specMask
Definition Player.h:137
Definition DBCStructure.h:1922
std::array< uint32, MAX_TALENT_RANK > RankID
Definition DBCStructure.h:1927
uint32 TalentID
Definition DBCStructure.h:1923
uint32 addToSpellBook
Definition DBCStructure.h:1933
uint16 talent_id
Definition DBCStructure.h:2235

References _addTalentAurasAndSpells(), _removeTalent(), _removeTalentAurasAndSpells(), TalentEntry::addToSpellBook, SpellMgr::CheckSpellValid(), GetActiveSpecMask(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), PlayerTalent::inSpellBook, isBeingLoaded(), m_talents, m_usedTalentCount, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_UNCHANGED, TalentSpellPos::rank, TalentEntry::RankID, SendLearnPacket(), PlayerTalent::specMask, SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, sTalentStore, PlayerTalent::State, TalentSpellPos::talent_id, PlayerTalent::talentID, and TalentEntry::TalentID.

Referenced by _LoadTalents(), and LearnTalent().

◆ AddTimedQuest()

void Player::AddTimedQuest ( uint32  quest_id)
inline
1565{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition Player.h:2705

References m_timedquests.

Referenced by _LoadQuestStatus(), and AddQuest().

◆ AddToWorld()

void Player::AddToWorld ( )
overridevirtual
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be added when logging in

Reimplemented from Object.

1703{
1708
1709 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1710 if (m_items[i])
1711 m_items[i]->AddToWorld();
1712}
@ PLAYER_SLOT_START
Definition Player.h:669
@ PLAYER_SLOT_END
Definition Player.h:671
void AddToWorld() override
Definition Unit.cpp:15754

References Object::AddToWorld(), Unit::AddToWorld(), m_items, PLAYER_SLOT_END, and PLAYER_SLOT_START.

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4133{
4134 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4135 m_itemSoulboundTradeable.push_back(item);
4136}
std::mutex m_soulboundTradableLock
Definition Player.h:2847
ItemDurationList m_itemSoulboundTradeable
Definition Player.h:2846

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by _LoadItem(), MoveItemToInventory(), and StoreNewItem().

◆ AddWeaponProficiency()

void Player::AddWeaponProficiency ( uint32  newflag)
inline
1369{ m_WeaponProficiency |= newflag; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

void Player::AddWhisperWhiteList ( ObjectGuid  guid)
inline
2567{ WhisperList.push_back(guid); }
WhisperListContainer WhisperList
Definition Player.h:2659

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1765{
1766 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1767 {
1768 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1769 {
1770 uint32 reqitemcount = quest->RequiredItemCount[i];
1771 if (reqitemcount != 0)
1772 {
1773 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1774
1775 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1776 m_QuestStatusSave[quest->GetQuestId()] = true;
1777 }
1778 }
1779 }
1780}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition PlayerStorage.cpp:327

References GetItemCount(), Quest::GetQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatusSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by AddQuest().

◆ ApplyEnchantment() [1/2]

void Player::ApplyEnchantment ( Item item,
bool  apply 
)
4299{
4300 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4301 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4302}

References ApplyEnchantment(), and MAX_ENCHANTMENT_SLOT.

◆ ApplyEnchantment() [2/2]

void Player::ApplyEnchantment ( Item item,
EnchantmentSlot  slot,
bool  apply,
bool  apply_dur = true,
bool  ignore_condition = false 
)
4305{
4306 if (!item || !item->IsEquipped())
4307 return;
4308
4309 if (slot >= MAX_ENCHANTMENT_SLOT)
4310 return;
4311
4312 uint32 enchant_id = item->GetEnchantmentId(slot);
4313 if (!enchant_id)
4314 return;
4315
4316 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4317 if (!pEnchant)
4318 return;
4319
4320 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4321 return;
4322
4323 if (pEnchant->requiredLevel > GetLevel())
4324 return;
4325
4326 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4327 return;
4328
4329 if (!sScriptMgr->CanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4330 return;
4331
4332 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4333 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4335 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4336 {
4337 // Check if the requirements for the prismatic socket are met before applying the gem stats
4339 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4340 return;
4341 }
4342
4343 if (!item->IsBroken())
4344 {
4345 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4346 {
4347 uint32 enchant_display_type = pEnchant->type[s];
4348 uint32 enchant_amount = pEnchant->amount[s];
4349 uint32 enchant_spell_id = pEnchant->spellid[s];
4350
4351 switch (enchant_display_type)
4352 {
4354 break;
4356 // processed in Player::CastItemCombatSpell
4357 break;
4359 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4360 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4361 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4362 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4363 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4364 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4365 break;
4367 if (enchant_spell_id)
4368 {
4369 if (apply)
4370 {
4371 int32 basepoints = 0;
4372 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4373 if (item->GetItemRandomPropertyId())
4374 {
4375 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4376 if (item_rand)
4377 {
4378 // Search enchant_amount
4379 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4380 {
4381 if (item_rand->Enchantment[k] == enchant_id)
4382 {
4383 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4384 break;
4385 }
4386 }
4387 }
4388 }
4389 // Cast custom spell vs all equal basepoints got from enchant_amount
4390 if (basepoints)
4391 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4392 else
4393 CastSpell(this, enchant_spell_id, true, item);
4394 }
4395 else
4396 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4397 }
4398 break;
4400 if (!enchant_amount)
4401 {
4402 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4403 if (item_rand)
4404 {
4405 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4406 {
4407 if (item_rand->Enchantment[k] == enchant_id)
4408 {
4409 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4410 break;
4411 }
4412 }
4413 }
4414 }
4415
4416 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4417 break;
4419 {
4420 if (!enchant_amount)
4421 {
4422 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4423 if (item_rand_suffix)
4424 {
4425 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4426 {
4427 if (item_rand_suffix->Enchantment[k] == enchant_id)
4428 {
4429 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4430 break;
4431 }
4432 }
4433 }
4434 }
4435
4436 sScriptMgr->OnApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
4437
4438 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4439 switch (enchant_spell_id)
4440 {
4441 case ITEM_MOD_MANA:
4442 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4443 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4444 break;
4445 case ITEM_MOD_HEALTH:
4446 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4447 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4448 break;
4449 case ITEM_MOD_AGILITY:
4450 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4451 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4452 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4453 break;
4454 case ITEM_MOD_STRENGTH:
4455 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4456 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4457 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4458 break;
4459 case ITEM_MOD_INTELLECT:
4460 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4461 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4462 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4463 break;
4464 case ITEM_MOD_SPIRIT:
4465 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4466 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4467 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4468 break;
4469 case ITEM_MOD_STAMINA:
4470 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4471 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4472 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4473 break;
4475 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4476 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4477 break;
4479 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4480 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4481 break;
4483 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4484 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4485 break;
4487 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4488 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4489 break;
4491 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4492 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4493 break;
4495 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4496 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4497 break;
4499 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4500 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4501 break;
4503 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4504 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4505 break;
4507 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4508 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4509 break;
4511 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4512 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4513 break;
4514 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4515 // in Enchantments
4516 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4517 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4518 // break;
4519 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4520 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4521 // break;
4522 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4523 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4524 // break;
4525 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4526 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4527 // break;
4528 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4529 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4530 // break;
4531 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4532 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4533 // break;
4534 // case ITEM_MOD_HASTE_MELEE_RATING:
4535 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4536 // break;
4538 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4539 break;
4541 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4542 break;
4544 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4545 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4546 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4547 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4548 break;
4550 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4551 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4552 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4553 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4554 break;
4555 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4556 // case ITEM_MOD_HIT_TAKEN_RATING:
4557 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4558 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4559 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4560 // break;
4561 // case ITEM_MOD_CRIT_TAKEN_RATING:
4562 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4563 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4564 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4565 // break;
4567 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4568 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4569 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4570 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4571 break;
4573 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4574 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4575 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4576 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4577 break;
4579 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4580 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4581 break;
4583 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4584 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4585 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4586 break;
4588 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4589 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4590 break;
4591 // case ITEM_MOD_FERAL_ATTACK_POWER:
4592 // ApplyFeralAPBonus(enchant_amount, apply);
4593 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4594 // break;
4596 ApplyManaRegenBonus(enchant_amount, apply);
4597 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4598 break;
4600 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4601 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4602 break;
4604 ApplySpellPowerBonus(enchant_amount, apply);
4605 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4606 break;
4608 ApplyHealthRegenBonus(enchant_amount, apply);
4609 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4610 break;
4612 ApplySpellPenetrationBonus(enchant_amount, apply);
4613 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4614 break;
4616 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4617 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4618 break;
4619 case ITEM_MOD_SPELL_HEALING_DONE: // deprecated
4620 case ITEM_MOD_SPELL_DAMAGE_DONE: // deprecated
4621 default:
4622 break;
4623 }
4624 break;
4625 }
4626 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4627 {
4629 {
4630 float addValue = 0.0f;
4631 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4632 {
4633 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4635 }
4636 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4637 {
4638 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4640 }
4641 }
4642 break;
4643 }
4645 // processed in Player::CastItemUseSpell
4646 break;
4648 // nothing do..
4649 break;
4650 default:
4651 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4652 break;
4653 } /*switch (enchant_display_type)*/
4654 } /*for*/
4655 }
4656
4657 // visualize enchantment at player and equipped items
4658 if (slot == PERM_ENCHANTMENT_SLOT)
4659 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4660
4661 if (slot == TEMP_ENCHANTMENT_SLOT)
4662 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4663
4664 if (apply_dur)
4665 {
4666 if (apply)
4667 {
4668 // set duration
4669 uint32 duration = item->GetEnchantmentDuration(slot);
4670 if (duration > 0)
4671 AddEnchantmentDuration(item, slot, duration);
4672 }
4673 else
4674 {
4675 // duration == 0 will remove EnchantDuration
4676 AddEnchantmentDuration(item, slot, 0);
4677 }
4678 }
4679}
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition DBCEnums.h:368
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition DBCEnums.h:367
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition DBCEnums.h:370
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition DBCEnums.h:366
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition DBCEnums.h:369
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition DBCEnums.h:374
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition DBCStructure.h:1837
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition DBCStructure.h:1203
@ PERM_ENCHANTMENT_SLOT
Definition Item.h:169
@ SOCK_ENCHANTMENT_SLOT_3
Definition Item.h:173
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
@ SOCK_ENCHANTMENT_SLOT_2
Definition Item.h:172
@ PRISMATIC_ENCHANTMENT_SLOT
Definition Item.h:175
@ SOCK_ENCHANTMENT_SLOT
Definition Item.h:171
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ UNIT_MOD_RESISTANCE_START
Definition Unit.h:172
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition UpdateFields.h:287
int32 GetItemRandomPropertyId() const
Definition Item.h:295
uint32 GetItemSuffixFactor() const
Definition Item.h:296
bool IsEquipped() const
Definition Item.cpp:789
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition Object.cpp:770
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5471
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition Player.cpp:11159
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1235
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition Unit.cpp:5118
Definition DBCStructure.h:1216
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition DBCStructure.h:1223
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition DBCStructure.h:1221
uint32 Delay
Definition ItemTemplate.h:659
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition ItemTemplate.h:681
Definition DBCStructure.h:1840
uint32 EnchantmentCondition
Definition DBCStructure.h:1852
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1844
uint32 requiredLevel
Definition DBCStructure.h:1855
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1846
uint32 requiredSkill
Definition DBCStructure.h:1853
uint32 requiredSkillValue
Definition DBCStructure.h:1854
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1843
uint32 Color
Definition ItemTemplate.h:602

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_SHAMAN, _Socket::Color, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_PARRY, ItemTemplate::Delay, ItemRandomSuffixEntry::Enchantment, SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, FLAT_MOD, Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), IsClass(), Item::IsEquipped(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_ENCHANTMENT_TYPE_DAMAGE, ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL, ITEM_ENCHANTMENT_TYPE_NONE, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET, ITEM_ENCHANTMENT_TYPE_RESISTANCE, ITEM_ENCHANTMENT_TYPE_STAT, ITEM_ENCHANTMENT_TYPE_TOTEM, ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, LOG_DEBUG, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_ENCHANTMENT_EFFECTS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, PERM_ENCHANTMENT_SLOT, PLAYER_VISIBLE_ITEM_1_ENCHANTMENT, PRISMATIC_ENCHANTMENT_SLOT, Unit::RemoveAurasDueToItemSpell(), SpellItemEnchantmentEntry::requiredLevel, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, Object::SetUInt16Value(), SHIELD_BLOCK_VALUE, sItemRandomSuffixStore, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, ItemTemplate::Socket, SpellItemEnchantmentEntry::spellid, sScriptMgr, sSpellItemEnchantmentStore, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, TEMP_ENCHANTMENT_SLOT, TOTAL_VALUE, SpellItemEnchantmentEntry::type, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_START, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), ApplyEnchantment(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Spell::EffectEnchantHeldItem(), Spell::EffectEnchantItemPerm(), Spell::EffectEnchantItemPrismatic(), Spell::EffectEnchantItemTmp(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleCancelTempEnchantmentOpcode(), WorldSession::HandleSocketOpcode(), RemoveArenaEnchantments(), SetVirtualItemSlot(), SwapItem(), ToggleMetaGemsActive(), UpdateEnchantTime(), and UpdateSkillEnchantments().

◆ ApplyEquipCooldown()

void Player::ApplyEquipCooldown ( Item pItem)
11809{
11811 return;
11812
11813 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11814 {
11815 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11816
11817 // no spell
11818 if (!spellData.SpellId)
11819 continue;
11820
11821 // xinef: apply hidden cooldown for procs
11823 {
11824 // xinef: uint32(-1) special marker for proc cooldowns
11825 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11826 continue;
11827 }
11828
11829 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11830 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11831 continue;
11832
11833 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11834 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11835 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11836 continue;
11837
11838 // Don't replace longer cooldowns by equip cooldown if we have any.
11839 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11840 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11841 continue;
11842
11843 // xinef: dont apply eqiup cooldown for spells with this attribute
11844 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11845 continue;
11846
11847 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11848
11850 data << pItem->GetGUID();
11851 data << uint32(spellData.SpellId);
11852 GetSession()->SendPacket(&data);
11853 }
11854}
@ ITEM_SPELLTRIGGER_ON_USE
Definition ItemTemplate.h:77
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition ItemTemplate.h:78
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition ItemTemplate.h:154
#define MAX_ITEM_PROTO_SPELLS
Definition ItemTemplate.h:615
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition SharedDefines.h:410
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11125
uint32 RecoveryTime
Definition SpellInfo.h:348
uint32 CategoryRecoveryTime
Definition SpellInfo.h:349
@ SMSG_ITEM_COOLDOWN
Definition Opcodes.h:206
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition ItemTemplate.h:662
Definition ItemTemplate.h:590
uint32 SpellTrigger
Definition ItemTemplate.h:592
int32 SpellCategoryCooldown
Definition ItemTemplate.h:597
int32 SpellCooldown
Definition ItemTemplate.h:595
int32 SpellId
Definition ItemTemplate.h:591

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetSession(), Item::GetTemplate(), SpellInfo::HasAttribute(), ItemTemplate::HasFlag(), IN_MILLISECONDS, ITEM_FLAG_NO_EQUIP_COOLDOWN, ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, m_spellCooldowns, MAX_ITEM_PROTO_SPELLS, SpellInfo::RecoveryTime, WorldSession::SendPacket(), SMSG_ITEM_COOLDOWN, SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL, _Spell::SpellCategoryCooldown, _Spell::SpellCooldown, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by EquipItem().

◆ ApplyEquipSpell()

void Player::ApplyEquipSpell ( SpellInfo const *  spellInfo,
Item item,
bool  apply,
bool  form_change = false 
)
7184{
7185 if (apply)
7186 {
7187 if (!sScriptMgr->CanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7188 return;
7189
7190 // Cannot be used in this stance/form
7191 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7192 return;
7193
7194 if (form_change) // check aura active state from other form
7195 {
7196 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7197 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7198 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7199 return;
7200 }
7201
7202 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7203
7204 //Ignore spellInfo->DurationEntry, cast with -1 duration
7205 CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_DURATION, -1, this, true, item);
7206 }
7207 else
7208 {
7209 if (form_change) // check aura compatibility
7210 {
7211 // Cannot be used in this stance/form
7212 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7213 return; // and remove only not compatible at form change
7214 }
7215
7216 if (item)
7217 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7218 else
7219 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7220
7221 // Xinef: Remove Proc Spells and Summons
7222 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
7223 {
7224 // Xinef: Remove procs
7225 if (spellInfo->Effects[i].TriggerSpell)
7226 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
7227
7228 // Xinef: remove minions summoned by item
7229 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SUMMON)
7230 RemoveAllMinionsByEntry(spellInfo->Effects[i].MiscValue);
7231 }
7232 }
7233}
@ EFFECT_0
Definition SharedDefines.h:31
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:806
@ SPELL_CAST_OK
Definition SharedDefines.h:1138
@ SPELLVALUE_AURA_DURATION
Definition SpellDefines.h:119
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1870
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:646
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1313
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:10922

References Unit::CastCustomSpell(), SpellInfo::CheckShapeshift(), EFFECT_0, SpellInfo::Effects, Unit::GetAppliedAuras(), Object::GetGUID(), Unit::GetShapeshiftForm(), SpellInfo::Id, LOG_DEBUG, MAX_SPELL_EFFECTS, Unit::RemoveAllMinionsByEntry(), Unit::RemoveAurasDueToItemSpell(), Unit::RemoveAurasDueToSpell(), SPELL_CAST_OK, SPELL_EFFECT_SUMMON, SPELLVALUE_AURA_DURATION, and sScriptMgr.

Referenced by AddItemsSetItem(), ApplyItemEquipSpell(), RemoveItemsSetItem(), and UpdateEquipSpellsAtFormChange().

◆ ApplyFeralAPBonus()

void Player::ApplyFeralAPBonus ( int32  amount,
bool  apply 
)
325{
326 _ModifyUInt32(apply, m_baseFeralAP, amount);
328}
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
Definition StatSystem.cpp:28
void UpdateAttackPowerAndDamage(bool ranged=false) override
Definition StatSystem.cpp:330

References _ModifyUInt32(), m_baseFeralAP, and UpdateAttackPowerAndDamage().

Referenced by _ApplyItemBonuses().

◆ ApplyHealthRegenBonus()

void Player::ApplyHealthRegenBonus ( int32  amount,
bool  apply 
)
920{
921 _ModifyUInt32(apply, m_baseHealthRegen, amount);
922}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
7133{
7134 if (!item)
7135 return;
7136
7137 ItemTemplate const* proto = item->GetTemplate();
7138 if (!proto)
7139 return;
7140
7141 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7142 {
7143 _Spell const& spellData = proto->Spells[i];
7144
7145 // no spell
7146 if (!spellData.SpellId)
7147 continue;
7148
7149 // Spells that should stay on the caster after removing the item.
7150 constexpr std::array<int32, 2> spellExceptions =
7151 {
7152 11826, //Electromagnetic Gigaflux Reactivator
7153 17490 //Book of the Dead - Summon Skeleton
7154 };
7155 const auto found = std::find(std::begin(spellExceptions), std::end(spellExceptions), spellData.SpellId);
7156
7157 // wrong triggering type
7158 if (apply)
7159 {
7161 {
7162 continue;
7163 }
7164 }
7165 else
7166 {
7167 // If the spell is an exception do not remove it.
7168 if (found != std::end(spellExceptions))
7169 {
7170 continue;
7171 }
7172 }
7173
7174 // check if it is valid spell
7175 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7176 if (!spellproto)
7177 continue;
7178
7179 ApplyEquipSpell(spellproto, item, apply, form_change);
7180 }
7181}
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition Player.cpp:7183

References ApplyEquipSpell(), Item::GetTemplate(), ITEM_SPELLTRIGGER_ON_EQUIP, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and UpdateEquipSpellsAtFormChange().

◆ ApplyManaRegenBonus()

void Player::ApplyManaRegenBonus ( int32  amount,
bool  apply 
)
914{
915 _ModifyUInt32(apply, m_baseManaRegen, amount);
917}
void UpdateManaRegen()
Definition StatSystem.cpp:924

References _ModifyUInt32(), m_baseManaRegen, and UpdateManaRegen().

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5281{
5282 float oldRating = m_baseRatingValue[cr];
5283 m_baseRatingValue[cr] += (apply ? value : -value);
5284 // explicit affected values
5285 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5286 {
5287 float const mult = GetRatingMultiplier(cr);
5288 float const oldVal = oldRating * mult;
5289 float const newVal = m_baseRatingValue[cr] * mult;
5290 switch (cr)
5291 {
5292 case CR_HASTE_MELEE:
5293 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5294 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5297 break;
5298 case CR_HASTE_RANGED:
5301 break;
5302 case CR_HASTE_SPELL:
5303 ApplyCastTimePercentMod(oldVal, false);
5304 ApplyCastTimePercentMod(newVal, true);
5305 break;
5306 default:
5307 break;
5308 }
5309 }
5310
5311 UpdateRating(cr);
5312}
float GetRatingMultiplier(CombatRating cr) const
Definition Player.cpp:5203
void UpdateRating(CombatRating cr)
Definition PlayerUpdates.cpp:611
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition Unit.cpp:17120
void ApplyCastTimePercentMod(float val, bool apply)
Definition Unit.cpp:17136

References Unit::ApplyAttackTimePercentMod(), Unit::ApplyCastTimePercentMod(), BASE_ATTACK, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, GetRatingMultiplier(), m_baseRatingValue, OFF_ATTACK, RANGED_ATTACK, and UpdateRating().

Referenced by _ApplyItemBonuses(), ApplyEnchantment(), AuraEffect::HandleModRating(), AuraEffect::HandleModRatingFromStat(), RecalculateRating(), and UpdateStats().

◆ ApplySpellMod()

template<class T >
template AC_GAME_API void Player::ApplySpellMod ( uint32  spellId,
SpellModOp  op,
T &  basevalue,
Spell spell = nullptr,
bool  temporaryPet = false 
)
9767{
9768 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9769 if (!spellInfo)
9770 {
9771 return;
9772 }
9773
9774 float totalmul = 1.0f;
9775 int32 totalflat = 0;
9776
9777 auto calculateSpellMod = [&](SpellModifier* mod)
9778 {
9779 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9780 if (temporaryPet && mod->charges != 0)
9781 {
9782 return;
9783 }
9784
9785 if (mod->type == SPELLMOD_FLAT)
9786 {
9787 // xinef: do not allow to consume more than one 100% crit increasing spell
9788 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9789 {
9790 return;
9791 }
9792
9793 int32 flatValue = mod->value;
9794
9795 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9796 if (mod->op == SPELLMOD_THREAT)
9797 {
9798 flatValue /= 100;
9799 }
9800
9801 totalflat += flatValue;
9802 }
9803 else if (mod->type == SPELLMOD_PCT)
9804 {
9805 // skip percent mods for null basevalue (most important for spell mods with charges)
9806 if (basevalue == T(0) || totalmul == 0.0f)
9807 {
9808 return;
9809 }
9810
9811 // special case (skip > 10sec spell casts for instant cast setting)
9812 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9813 {
9814 return;
9815 }
9816 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9817 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9818 {
9819 return;
9820 }
9821 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9822 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9823 {
9824 return;
9825 }
9826
9827 // xinef: those two mods should be multiplicative (Glyph of Renew)
9828 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9829 {
9830 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9831 }
9832 else
9833 {
9834 totalmul += CalculatePct(1.0f, mod->value);
9835 }
9836 }
9837
9838 DropModCharge(mod, spell);
9839 };
9840
9841 // Drop charges for triggering spells instead of triggered ones
9843 {
9844 spell = m_spellModTakingSpell;
9845 }
9846
9847 SpellModifier* chargedMod = nullptr;
9848 for (auto mod : m_spellMods[op])
9849 {
9850 // Charges can be set only for mods with auras
9851 if (!mod->ownerAura)
9852 {
9853 ASSERT(!mod->charges);
9854 }
9855
9856 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9857 {
9858 continue;
9859 }
9860
9861 if (mod->ownerAura->IsUsingCharges())
9862 {
9863 if (!chargedMod || (chargedMod->ownerAura->GetSpellInfo()->SpellPriority < mod->ownerAura->GetSpellInfo()->SpellPriority))
9864 {
9865 chargedMod = mod;
9866 }
9867
9868 continue;
9869 }
9870
9871 calculateSpellMod(mod);
9872 }
9873
9874 if (chargedMod)
9875 {
9876 calculateSpellMod(chargedMod);
9877 }
9878
9879 float diff = 0.0f;
9880 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9881 {
9882 diff = ((float)basevalue + totalflat) * (totalmul - 1.0f) + (float)totalflat;
9883 }
9884 else
9885 {
9886 diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
9887 }
9888
9889 basevalue = T((float)basevalue + diff);
9890}
@ SPELLMOD_PCT
Definition Player.h:94
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ SPELLMOD_GLOBAL_COOLDOWN
Definition SpellDefines.h:97
@ SPELLMOD_THREAT
Definition SpellDefines.h:78
@ SPELLMOD_DURATION
Definition SpellDefines.h:77
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
T CalculatePct(T base, U pct)
Definition Util.h:61
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition Player.cpp:10103
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition Player.cpp:9741
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition Player.cpp:9749
uint32 SpellPriority
Definition SpellInfo.h:382
Definition Player.h:181

References ASSERT, CalculatePct(), DropModCharge(), Aura::GetSpellInfo(), HasSpellMod(), IsAffectedBySpellmod(), m_spellMods, m_spellModTakingSpell, SpellModifier::ownerAura, SPELLMOD_CASTING_TIME, SPELLMOD_CRITICAL_CHANCE, SPELLMOD_DAMAGE, SPELLMOD_DOT, SPELLMOD_DURATION, SPELLMOD_FLAT, SPELLMOD_GLOBAL_COOLDOWN, SPELLMOD_PCT, SPELLMOD_THREAT, SpellInfo::SpellPriority, and sSpellMgr.

Referenced by AddSpellAndCategoryCooldowns(), Aura::CalcMaxDuration(), AuraEffect::CalculatePeriodic(), CastItemCombatSpell(), Spell::Delayed(), Spell::DelayedChannel(), and Spell::TriggerGlobalCooldown().

◆ ApplySpellPenetrationBonus()

void Player::ApplySpellPenetrationBonus ( int32  amount,
bool  apply 
)
220{
222 m_spellPenetrationItemMod += apply ? amount : -amount;
223}
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
Definition UpdateFields.h:366
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:815

References Object::ApplyModInt32Value(), m_spellPenetrationItemMod, and PLAYER_FIELD_MOD_TARGET_RESISTANCE.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellPowerBonus()

void Player::ApplySpellPowerBonus ( int32  amount,
bool  apply 
)
168{
169 apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
170
171 // For speed just update for client
173 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
175}
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:284
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
Definition UpdateFields.h:363

References _ModifyUInt32(), Object::ApplyModInt32Value(), Object::ApplyModUInt32Value(), m_baseSpellPower, MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, and SPELL_SCHOOL_HOLY.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ AreaExploredOrEventHappens()

void Player::AreaExploredOrEventHappens ( uint32  questId)
1792{
1793 if (questId)
1794 {
1795 uint16 log_slot = FindQuestSlot(questId);
1796 QuestStatusData* q_status = nullptr;
1797 if (log_slot < MAX_QUEST_LOG_SIZE)
1798 {
1799 q_status = &m_QuestStatus[questId];
1800
1801 // xinef: added failed check
1802 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1803 {
1804 q_status->Explored = true;
1805 m_QuestStatusSave[questId] = true;
1806
1807 SendQuestComplete(questId);
1808 }
1809 }
1810 if (CanCompleteQuest(questId, q_status))
1811 CompleteQuest(questId);
1812 else
1814 }
1815}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition Player.h:998
void SendQuestComplete(uint32 quest_id)
Definition PlayerQuest.cpp:2346
void AdditionalSavingAddMask(uint8 mask)
Definition Player.h:2582

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::Explored, FindQuestSlot(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_STATUS_FAILED, SendQuestComplete(), and QuestStatusData::Status.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), Spell::EffectQuestComplete(), SmartAI::EndPath(), dragonmaw_race_npc::FinishRace(), go_ahune_ice_stone::GossipSelect(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), boss_alar::JustDied(), go_table_theka::OnGossipHello(), npc_parqual_fintallas::OnGossipSelect(), npc_great_bear_spirit::OnGossipSelect(), npc_thrall_warchief::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_stone_watcher_of_norgannon::OnGossipSelect(), npc_vekjik::OnGossipSelect(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_doctor::npc_doctorAI::PatientSaved(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), and npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI().

◆ AutoStoreLoot() [1/2]

void Player::AutoStoreLoot ( uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
inline
1325{ AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition Player.cpp:13529

References AutoStoreLoot(), NULL_BAG, and NULL_SLOT.

Referenced by AutoStoreLoot().

◆ AutoStoreLoot() [2/2]

void Player::AutoStoreLoot ( uint8  bag,
uint8  slot,
uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
13530{
13531 Loot loot;
13532 loot.FillLoot (loot_id, store, this, true);
13533
13534 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13535 for (uint32 i = 0; i < max_slot; ++i)
13536 {
13537 LootItem* lootItem = loot.LootItemInSlot(i, this);
13538
13539 ItemPosCountVec dest;
13540 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13541 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13542 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13543 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13544 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13545 if (msg != EQUIP_ERR_OK)
13546 {
13547 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13548 continue;
13549 }
13550
13551 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13552 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13553 }
13554}
Definition LootMgr.h:154
uint32 itemid
Definition LootMgr.h:155
int32 randomPropertyId
Definition LootMgr.h:158
uint8 count
Definition LootMgr.h:162
Definition LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition LootMgr.cpp:915
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition LootMgr.cpp:850
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:570

References CanStoreNewItem(), LootItem::count, EQUIP_ERR_OK, Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), LootItem::itemid, Loot::LootItemInSlot(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by Group::CountTheRoll(), Spell::EffectCreateItem2(), Spell::EffectCreateRandomItem(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ AutoUnequipOffhandIfNeed()

void Player::AutoUnequipOffhandIfNeed ( bool  force = false)
12501{
12503 if (!offItem)
12504 {
12506 return;
12507 }
12508
12509 // unequip offhand weapon if player doesn't have dual wield anymore
12511 force = true;
12512
12513 // unequip offhand weapon if player main hand weapon is a polearm or staff or fishing pole
12515 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
12516 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
12517 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
12518 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
12519 force = true;
12520
12521 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12522 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12523 {
12525 return;
12526 }
12527
12528 ItemPosCountVec off_dest;
12529 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12530 if (off_msg == EQUIP_ERR_OK)
12531 {
12533 StoreItem(off_dest, offItem, true);
12534 }
12535 else
12536 {
12538 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12539 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12540 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12541
12542 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12543 MailDraft(subject, "There were problems with equipping one or several items").AddItem(offItem).SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
12544
12545 CharacterDatabase.CommitTransaction(trans);
12546 }
12548}
@ ITEM_SUBCLASS_WEAPON_STAFF
Definition ItemTemplate.h:354
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition ItemTemplate.h:364
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition ItemTemplate.h:350
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition Mail.cpp:185
MailDraft & AddItem(Item *item)
Definition Mail.cpp:93
bool CanTitanGrip() const
Definition Player.h:2195
bool IsTwoHandUsed() const
Definition Player.h:1374
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition PlayerStorage.cpp:2978
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition PlayerStorage.cpp:2899
void UpdateTitansGrip()
Definition PlayerUpdates.cpp:1836
bool CanDualWield() const
Definition Unit.h:932
uint32 InventoryType
Definition ItemTemplate.h:632

References MailDraft::AddItem(), Unit::CanDualWield(), CanStoreItem(), CanTitanGrip(), CharacterDatabase, Item::DeleteFromInventoryDB(), EQUIP_ERR_OK, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, WorldSession::GetAcoreString(), GetItemByPos(), GetSession(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, IsTwoHandUsed(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LANG_NOT_EQUIPPED_ITEM, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MoveItemFromInventory(), NULL_BAG, NULL_SLOT, RemoveItem(), Item::SaveToDB(), MailDraft::SendMailTo(), StoreItem(), and UpdateTitansGrip().

Referenced by _StoreOrEquipNewItem(), ActivateSpec(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), resetTalents(), SplitItem(), StoreNewItemInBestSlots(), SwapItem(), and UpdateZone().

◆ BankItem() [1/2]

Item * Player::BankItem ( ItemPosCountVec const &  dest,
Item pItem,
bool  update 
)
inline

◆ BankItem() [2/2]

Item * Player::BankItem ( uint16  pos,
Item pItem,
bool  update 
)

◆ BindToInstance()

void Player::BindToInstance ( )
6509{
6510 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6511 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6512 return;
6513
6515 data << uint32(0);
6516 GetSession()->SendPacket(&data);
6517 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6518}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
Definition InstanceSaveMgr.h:56
uint32 _pendingBindId
Definition Player.h:2996
@ SMSG_INSTANCE_SAVE_CREATED
Definition Opcodes.h:745

References _pendingBindId, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_INSTANCE_SAVE_CREATED.

Referenced by WorldSession::HandleInstanceLockResponse(), and Update().

◆ BuildCreateUpdateBlockForPlayer()

void Player::BuildCreateUpdateBlockForPlayer ( UpdateData data,
Player target 
)
overridevirtual

Reimplemented from Object.

3831{
3832 if (target == this)
3833 {
3834 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3835 {
3836 if (!m_items[i])
3837 continue;
3838
3839 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3840 }
3841
3843 {
3844 if (!m_items[i])
3845 continue;
3846
3847 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3848 }
3850 {
3851 if (!m_items[i])
3852 continue;
3853
3854 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3855 }
3856 }
3857
3859}
@ KEYRING_SLOT_START
Definition Player.h:735
@ BANK_SLOT_BAG_END
Definition Player.h:723
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:189

References BANK_SLOT_BAG_END, Object::BuildCreateUpdateBlockForPlayer(), CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

Referenced by Map::SendInitSelf().

◆ BuildEnchantmentsInfoData()

void Player::BuildEnchantmentsInfoData ( WorldPacket data)
14471{
14472 uint32 slotUsedMask = 0;
14473 std::size_t slotUsedMaskPos = data->wpos();
14474 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14475
14476 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14477 {
14479
14480 if (!item)
14481 continue;
14482
14483 slotUsedMask |= (1 << i);
14484
14485 *data << uint32(item->GetEntry()); // item entry
14486
14487 uint16 enchantmentMask = 0;
14488 std::size_t enchantmentMaskPos = data->wpos();
14489 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14490
14491 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14492 {
14493 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14494
14495 if (!enchId)
14496 continue;
14497
14498 enchantmentMask |= (1 << j);
14499
14500 *data << uint16(enchId); // enchantmentId?
14501 }
14502
14503 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14504
14505 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14506 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14507 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14508 }
14509
14510 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14511}
@ ITEM_FIELD_CREATOR
Definition UpdateFields.h:37
std::size_t wpos() const
Definition ByteBuffer.h:330
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
ObjectGuid GetGuidValue(uint16 index) const
Definition Object.cpp:337

References EQUIPMENT_SLOT_END, Item::GetEnchantmentId(), Object::GetEntry(), Object::GetGuidValue(), GetItemByPos(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), INVENTORY_SLOT_BAG_0, ITEM_FIELD_CREATOR, MAX_ENCHANTMENT_SLOT, ByteBuffer::put(), ByteBuffer::wpos(), and ObjectGuid::WriteAsPacked().

Referenced by WorldSession::HandleInspectOpcode().

◆ BuildEnumData()

bool Player::BuildEnumData ( PreparedQueryResult  result,
WorldPacket data 
)
static
1091{
1092 // 0 1 2 3 4 5 6 7
1093 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1094 // 8 9 10 11 12 13 14 15
1095 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1096 // 16 17 18 19 20 21 22 23
1097 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1098 // 24 25
1099 // characters.extra_flags, character_declinedname.genitive
1100
1101 Field* fields = result->Fetch();
1102
1103 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1104 uint8 plrRace = fields[2].Get<uint8>();
1105 uint8 plrClass = fields[3].Get<uint8>();
1106 uint8 gender = fields[4].Get<uint8>();
1107
1108 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1109
1110 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1111 if (!info)
1112 {
1113 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1114 return false;
1115 }
1116 else if (!IsValidGender(gender))
1117 {
1118 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1119 return false;
1120 }
1121
1122 *data << guid;
1123 *data << fields[1].Get<std::string>(); // name
1124 *data << uint8(plrRace); // race
1125 *data << uint8(plrClass); // class
1126 *data << uint8(gender); // gender
1127
1128 uint8 skin = fields[5].Get<uint8>();
1129 uint8 face = fields[6].Get<uint8>();
1130 uint8 hairStyle = fields[7].Get<uint8>();
1131 uint8 hairColor = fields[8].Get<uint8>();
1132 uint8 facialStyle = fields[9].Get<uint8>();
1133
1134 uint32 charFlags = 0;
1135 uint32 playerFlags = fields[17].Get<uint32>();
1136 uint16 atLoginFlags = fields[18].Get<uint16>();
1137 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1138
1139 *data << uint8(skin);
1140 *data << uint8(face);
1141 *data << uint8(hairStyle);
1142 *data << uint8(hairColor);
1143 *data << uint8(facialStyle);
1144
1145 *data << uint8(fields[10].Get<uint8>()); // level
1146 *data << uint32(zone); // zone
1147 *data << uint32(fields[12].Get<uint16>()); // map
1148
1149 *data << fields[13].Get<float>(); // x
1150 *data << fields[14].Get<float>(); // y
1151 *data << fields[15].Get<float>(); // z
1152
1153 *data << uint32(fields[16].Get<uint32>()); // guild id
1154
1155 if (atLoginFlags & AT_LOGIN_RESURRECT)
1156 playerFlags &= ~PLAYER_FLAGS_GHOST;
1157 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1158 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1159 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1160 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1161 if (playerFlags & PLAYER_FLAGS_GHOST)
1162 charFlags |= CHARACTER_FLAG_GHOST;
1163 if (atLoginFlags & AT_LOGIN_RENAME)
1164 charFlags |= CHARACTER_FLAG_RENAME;
1165 if (fields[23].Get<uint32>())
1167 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1168 {
1169 if (!fields[25].Get<std::string>().empty())
1170 charFlags |= CHARACTER_FLAG_DECLINED;
1171 }
1172 else
1173 charFlags |= CHARACTER_FLAG_DECLINED;
1174
1175 *data << uint32(charFlags); // character flags
1176
1177 // character customize flags
1178 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1180 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1182 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1184 else
1186
1187 // First login
1188 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1189
1190 // Pets info
1191 uint32 petDisplayId = 0;
1192 uint32 petLevel = 0;
1193 uint32 petFamily = 0;
1194
1195 // show pet at selection character in character list only for non-ghost character
1196 if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || (plrClass == CLASS_DEATH_KNIGHT && (fields[21].Get<uint32>()&PLAYER_EXTRA_SHOW_DK_PET))))
1197 {
1198 uint32 entry = fields[19].Get<uint32>();
1199 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1200 if (creatureInfo)
1201 {
1202 petDisplayId = fields[20].Get<uint32>();
1203 petLevel = fields[21].Get<uint16>();
1204 petFamily = creatureInfo->family;
1205 }
1206 }
1207
1208 *data << uint32(petDisplayId);
1209 *data << uint32(petLevel);
1210 *data << uint32(petFamily);
1211
1212 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1213 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1214 {
1215 uint32 const visualBase = slot * 2;
1216 Optional<uint32> itemId;
1217
1218 if (visualBase < equipment.size())
1219 {
1220 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1221 }
1222
1223 ItemTemplate const* proto = nullptr;
1224 if (itemId)
1225 {
1226 proto = sObjectMgr->GetItemTemplate(*itemId);
1227 }
1228
1229 if (!proto)
1230 {
1231 if (!itemId || *itemId)
1232 {
1233 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1234 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1235 }
1236
1237 *data << uint32(0);
1238 *data << uint8(0);
1239 *data << uint32(0);
1240
1241 continue;
1242 }
1243
1244 SpellItemEnchantmentEntry const* enchant = nullptr;
1245
1246 Optional<uint32> enchants = {};
1247 if ((visualBase + 1) < equipment.size())
1248 {
1249 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1250 }
1251
1252 if (!enchants)
1253 {
1254 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1255 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1256
1257 enchants = 0;
1258 }
1259
1260 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1261 {
1262 // values stored in 2 uint16
1263 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1264 if (!enchantId)
1265 {
1266 continue;
1267 }
1268
1269 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1270 if (enchant)
1271 {
1272 break;
1273 }
1274 }
1275
1276 *data << uint32(proto->DisplayInfoID);
1277 *data << uint8(proto->InventoryType);
1278 *data << uint32(enchant ? enchant->aura_id : 0);
1279 }
1280
1281 return true;
1282}
@ CONFIG_DECLINED_NAMES_USED
Definition IWorld.h:108
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition Player.cpp:137
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition Player.cpp:134
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition Player.cpp:136
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition Player.cpp:135
@ CHARACTER_FLAG_GHOST
Definition Player.cpp:111
@ CHARACTER_FLAG_DECLINED
Definition Player.cpp:123
@ CHARACTER_FLAG_HIDE_HELM
Definition Player.cpp:108
@ CHARACTER_FLAG_HIDE_CLOAK
Definition Player.cpp:109
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition Player.cpp:122
@ CHARACTER_FLAG_RENAME
Definition Player.cpp:112
@ PLAYER_EXTRA_SHOW_DK_PET
Definition Player.h:598
@ PLAYER_FLAGS_HIDE_CLOAK
Definition Player.h:490
@ PLAYER_FLAGS_GHOST
Definition Player.h:483
@ PLAYER_FLAGS_HIDE_HELM
Definition Player.h:489
@ AT_LOGIN_FIRST
Definition Player.h:610
@ AT_LOGIN_RESURRECT
Definition Player.h:616
@ AT_LOGIN_CUSTOMIZE
Definition Player.h:608
@ AT_LOGIN_RENAME
Definition Player.h:605
@ AT_LOGIN_CHANGE_RACE
Definition Player.h:612
@ AT_LOGIN_CHANGE_FACTION
Definition Player.h:611
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARLOCK
Definition SharedDefines.h:149
static bool IsValidGender(uint8 Gender)
Definition Player.h:1581
Definition CreatureData.h:186
uint32 DisplayInfoID
Definition ItemTemplate.h:625
uint32 aura_id
Definition DBCStructure.h:1849

References AT_LOGIN_CHANGE_FACTION, AT_LOGIN_CHANGE_RACE, AT_LOGIN_CUSTOMIZE, AT_LOGIN_FIRST, AT_LOGIN_RENAME, AT_LOGIN_RESURRECT, SpellItemEnchantmentEntry::aura_id, CHAR_CUSTOMIZE_FLAG_CUSTOMIZE, CHAR_CUSTOMIZE_FLAG_FACTION, CHAR_CUSTOMIZE_FLAG_NONE, CHAR_CUSTOMIZE_FLAG_RACE, CHARACTER_FLAG_DECLINED, CHARACTER_FLAG_GHOST, CHARACTER_FLAG_HIDE_CLOAK, CHARACTER_FLAG_HIDE_HELM, CHARACTER_FLAG_LOCKED_BY_BILLING, CHARACTER_FLAG_RENAME, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_WARLOCK, CONFIG_DECLINED_NAMES_USED, ItemTemplate::DisplayInfoID, Field::Get(), INVENTORY_SLOT_BAG_END, ItemTemplate::InventoryType, IsValidGender(), LOG_ERROR, LOG_WARN, PERM_ENCHANTMENT_SLOT, PLAYER_EXTRA_SHOW_DK_PET, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, sObjectMgr, sSpellItemEnchantmentStore, sWorld, TEMP_ENCHANTMENT_SLOT, and Acore::Tokenize().

Referenced by WorldSession::HandleCharEnum().

◆ BuildPetTalentsInfoData()

void Player::BuildPetTalentsInfoData ( WorldPacket data)
14388{
14389 uint32 unspentTalentPoints = 0;
14390 std::size_t pointsPos = data->wpos();
14391 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14392
14393 uint8 talentIdCount = 0;
14394 std::size_t countPos = data->wpos();
14395 *data << uint8(talentIdCount); // [PH], talentIdCount
14396
14397 Pet* pet = GetPet();
14398 if (!pet)
14399 return;
14400
14401 unspentTalentPoints = pet->GetFreeTalentPoints();
14402
14403 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14404
14405 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14406 if (!ci)
14407 return;
14408
14409 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14410 if (!pet_family || pet_family->petTalentType < 0)
14411 return;
14412
14413 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14414 {
14415 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14416 if (!talentTabInfo)
14417 continue;
14418
14419 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14420 continue;
14421
14422 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14423 {
14424 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14425 if (!talentInfo)
14426 continue;
14427
14428 // skip another tab talents
14429 if (talentInfo->TalentTab != talentTabId)
14430 continue;
14431
14432 // find max talent rank (0~4)
14433 int8 curtalent_maxrank = -1;
14434 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14435 {
14436 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14437 {
14438 curtalent_maxrank = rank;
14439 break;
14440 }
14441 }
14442
14443 // not learned talent
14444 if (curtalent_maxrank < 0)
14445 continue;
14446
14447 *data << uint32(talentInfo->TalentID); // Talent.dbc
14448 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14449
14450 ++talentIdCount;
14451 }
14452
14453 data->put<uint8>(countPos, talentIdCount); // put real count
14454
14455 break;
14456 }
14457}
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition DBCStructure.h:1917
std::int8_t int8
Definition Define.h:105
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:208
uint8 GetFreeTalentPoints()
Definition Pet.h:131
bool HasSpell(uint32 spell) const override
Definition Pet.cpp:2334
Definition DBCStructure.h:753
int32 petTalentType
Definition DBCStructure.h:761
uint32 TalentTab
Definition DBCStructure.h:1924
Definition DBCStructure.h:1939
uint32 petTalentMask
Definition DBCStructure.h:1946

References Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), GetPet(), Pet::HasSpell(), MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, ByteBuffer::put(), TalentEntry::RankID, sCreatureFamilyStore, sTalentStore, sTalentTabStore, TalentEntry::TalentID, TalentEntry::TalentTab, and ByteBuffer::wpos().

Referenced by SendTalentsInfoData().

◆ BuildPlayerRepop()

void Player::BuildPlayerRepop ( )
4444{
4446 data << GetPackGUID();
4447 GetSession()->SendPacket(&data);
4448 if (getRace(true) == RACE_NIGHTELF)
4449 {
4450 CastSpell(this, 20584, true);
4451 }
4452 CastSpell(this, 8326, true);
4453
4454 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4455 // there must be SMSG.STOP_MIRROR_TIMER
4456
4457 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4458 WorldLocation corpseLocation = GetCorpseLocation();
4459 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4460 {
4461 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4462 return;
4463 }
4464
4465 // create a corpse and place it at the player's location
4466 Corpse* corpse = CreateCorpse();
4467 if (!corpse)
4468 {
4469 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4470 return;
4471 }
4472 GetMap()->AddToMap(corpse);
4473 SetHealth(1); // convert player body to ghost
4475 SetWaterWalking(true);
4476 if (!GetSession()->isLogingOut())
4477 {
4479 }
4480 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4481 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4482 if (corpseReclaimDelay >= 0)
4483 {
4484 SendCorpseReclaimDelay(corpseReclaimDelay);
4485 }
4486 corpse->ResetGhostTime(); // to prevent cheating
4487 StopMirrorTimers(); // disable timers on bars
4489 sScriptMgr->OnPlayerReleasedGhost(this);
4490}
@ MOVE_UNROOT
Definition Player.h:462
@ MOVE_WATER_WALK
Definition Player.h:463
@ RACE_NIGHTELF
Definition SharedDefines.h:74
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition UnitDefines.h:59
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:276
@ UNIT_FIELD_BYTES_1
Definition UpdateFields.h:131
Definition Corpse.h:49
void ResetGhostTime()
Definition Corpse.cpp:195
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:558
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:750
PackedGuid const & GetPackGUID() const
Definition Object.h:114
void SendCorpseReclaimDelay(uint32 delay)
Definition Player.cpp:13017
void StopMirrorTimers()
Definition Player.h:2062
WorldLocation GetCorpseLocation() const
Definition Player.h:2046
Corpse * GetCorpse() const
Definition Player.cpp:4728
bool SetWaterWalking(bool apply, bool packetOnly=false) override
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition Player.cpp:15999
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition Player.cpp:12976
Corpse * CreateCorpse()
Definition Player.cpp:4613
void SetMovement(PlayerMovementType pType)
Definition Player.cpp:4413
void SetHealth(uint32 val)
Definition Unit.cpp:15544
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:720
Map * GetMap() const
Definition Object.h:536
@ SMSG_PRE_RESURRECT
Definition Opcodes.h:1202

References Map::AddToMap(), CalculateCorpseReclaimDelay(), Unit::CastSpell(), CreateCorpse(), GetCorpse(), GetCorpseLocation(), Object::GetGUID(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Object::GetPackGUID(), Unit::getRace(), GetSession(), LOG_ERROR, MOVE_UNROOT, MOVE_WATER_WALK, RACE_NIGHTELF, Unit::RemoveUnitFlag(), Corpse::ResetGhostTime(), SendCorpseReclaimDelay(), WorldSession::SendPacket(), Object::SetByteValue(), Unit::SetHealth(), SetMovement(), SetWaterWalking(), SMSG_PRE_RESURRECT, sScriptMgr, StopMirrorTimers(), Position::ToString(), UNIT_BYTE1_FLAG_ALWAYS_STAND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, and UNIT_FLAG_SKINNABLE.

Referenced by Spell::EffectStuck(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), RemovedInsignia(), and Update().

◆ BuildPlayerTalentsInfoData()

void Player::BuildPlayerTalentsInfoData ( WorldPacket data)
14354{
14355 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14356 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14357 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14358
14361
14362 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14363 {
14364 uint8 talentIdCount = 0;
14365 std::size_t pos = data->wpos();
14366 *data << uint8(talentIdCount); // [PH], talentIdCount
14367
14368 const PlayerTalentMap& talentMap = GetTalentMap();
14369 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14370 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14371 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14372 {
14373 *data << uint32(talentPos->talent_id); // Talent.dbc
14374 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14375 ++talentIdCount;
14376 }
14377
14378 data->put<uint8>(pos, talentIdCount); // put real count
14379
14380 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14381
14382 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14383 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14384 }
14385}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition Player.h:192
uint32 GetFreeTalentPoints() const
Definition Player.h:1721
const PlayerTalentMap & GetTalentMap() const
Definition Player.h:2618

References GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), m_activeSpec, m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, MAX_TALENT_SPECS, PLAYERSPELL_REMOVED, ByteBuffer::put(), and ByteBuffer::wpos().

Referenced by WorldSession::HandleInspectOpcode(), and SendTalentsInfoData().

◆ BuyItemFromVendorSlot()

bool Player::BuyItemFromVendorSlot ( ObjectGuid  vendorguid,
uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot 
)
10749{
10750 sScriptMgr->OnBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10751
10752 // this check can be used from the hook to implement a custom vendor process
10753 if (item == 0)
10754 return true;
10755
10756 // cheating attempt
10757 if (count < 1) count = 1;
10758
10759 // cheating attempt
10760 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10761 return false;
10762
10763 if (!IsAlive())
10764 return false;
10765
10766 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10767 if (!pProto)
10768 {
10769 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10770 return false;
10771 }
10772
10773 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10774 {
10775 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10776 return false;
10777 }
10778
10780 {
10781 return false;
10782 }
10783
10784 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10785 if (!creature)
10786 {
10787 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10788 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10789 return false;
10790 }
10791
10792 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10793 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10794 {
10795 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10796 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10797 return false;
10798 }
10799
10800 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10801 if (!vItems || vItems->Empty())
10802 {
10803 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10804 return false;
10805 }
10806
10807 if (vendorslot >= vItems->GetItemCount())
10808 {
10809 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10810 return false;
10811 }
10812
10813 VendorItem const* crItem = vItems->GetItem(vendorslot);
10814 // store diff item (cheating)
10815 if (!crItem || crItem->item != item)
10816 {
10817 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10818 return false;
10819 }
10820
10821 // check current item amount if it limited
10822 if (crItem->maxcount != 0)
10823 {
10824 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10825 {
10826 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10827 return false;
10828 }
10829 }
10830
10832 {
10833 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10834 return false;
10835 }
10836
10837 if (crItem->ExtendedCost)
10838 {
10839 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10840 if (!iece)
10841 {
10842 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10843 return false;
10844 }
10845
10846 // honor points price
10847 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10848 {
10850 return false;
10851 }
10852
10853 // arena points price
10854 if (GetArenaPoints() < (iece->reqarenapoints * count))
10855 {
10857 return false;
10858 }
10859
10860 // item base price
10861 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10862 {
10863 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10864 {
10866 return false;
10867 }
10868 }
10869
10870 // check for personal arena rating requirement
10872 {
10873 // probably not the proper equip err
10874 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10875 return false;
10876 }
10877 }
10878
10879 uint32 price = 0;
10880 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10881 {
10882 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10883 if ((uint32)count > maxCount)
10884 {
10885 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10886 count = (uint8)maxCount;
10887 }
10888 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10889
10890 // reputation discount
10891 price = uint32(std::floor(price * GetReputationPriceDiscount(creature)));
10892
10893 if (!HasEnoughMoney(price))
10894 {
10895 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10896 return false;
10897 }
10898 }
10899
10900 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10901 {
10902 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10903 return false;
10904 }
10905 else if (IsEquipmentPos(bag, slot))
10906 {
10907 if (pProto->BuyCount * count != 1)
10908 {
10910 return false;
10911 }
10912 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10913 return false;
10914 }
10915 else
10916 {
10918 return false;
10919 }
10920
10921 return crItem->maxcount != 0;
10922}
#define MAX_BAG_SIZE
Definition Bag.h:22
#define sConditionMgr
Definition ConditionMgr.h:290
std::list< Condition * > ConditionList
Definition ConditionMgr.h:237
@ ITEM_FLAG2_FACTION_HORDE
Definition ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition ItemTemplate.h:184
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition Item.h:110
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition Item.h:67
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition Item.h:116
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition Item.h:50
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition Item.h:115
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition Item.h:117
@ BUY_ERR_CANT_FIND_ITEM
Definition Item.h:141
@ BUY_ERR_DISTANCE_TOO_FAR
Definition Item.h:145
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition Item.h:143
@ BUY_ERR_REPUTATION_REQUIRE
Definition Item.h:149
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition Item.h:142
#define MAX_MONEY_AMOUNT
Definition Player.h:935
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ TEAM_HORDE
Definition SharedDefines.h:761
@ UNIT_NPC_FLAG_VENDOR
Definition UnitDefines.h:322
Definition Creature.h:43
VendorItemData const * GetVendorItems() const
Definition Creature.cpp:3074
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition Creature.cpp:3079
bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
Definition Player.cpp:10682
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:655
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1618
Creature * GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
Definition Player.cpp:2099
bool IsGameMaster() const
Definition Player.h:1175
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5896
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition PlayerStorage.cpp:4064
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition Player.cpp:10924
uint32 GetCurrentVendor() const
Definition WorldSession.h:380
uint32 reqarenaslot
Definition DBCStructure.h:1188
uint32 reqpersonalarenarating
Definition DBCStructure.h:1191
uint32 BuyCount
Definition ItemTemplate.h:629
uint32 AllowableClass
Definition ItemTemplate.h:633
int32 BuyPrice
Definition ItemTemplate.h:630
bool HasFlag2(ItemFlags2 flag) const
Definition ItemTemplate.h:828
uint32 RequiredReputationRank
Definition ItemTemplate.h:643
uint32 RequiredReputationFaction
Definition ItemTemplate.h:642
uint32 ItemId
Definition ItemTemplate.h:620
Definition CreatureData.h:469
VendorItem * GetItem(uint32 slot) const
Definition CreatureData.h:472
bool Empty() const
Definition CreatureData.h:479
uint8 GetItemCount() const
Definition CreatureData.h:480
Definition CreatureData.h:454
uint32 ExtendedCost
Definition CreatureData.h:461
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition CreatureData.h:464
uint32 item
Definition CreatureData.h:458
uint32 maxcount
Definition CreatureData.h:459

References _StoreOrEquipNewItem(), ItemTemplate::AllowableClass, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, BUY_ERR_CANT_FIND_ITEM, BUY_ERR_DISTANCE_TOO_FAR, BUY_ERR_ITEM_ALREADY_SOLD, BUY_ERR_NOT_ENOUGHT_MONEY, BUY_ERR_REPUTATION_REQUIRE, ItemTemplate::BuyCount, ItemTemplate::BuyPrice, VendorItemData::Empty(), EQUIP_ERR_CANT_EQUIP_RANK, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, EQUIP_ERR_VENDOR_MISSING_TURNINS, VendorItem::ExtendedCost, GetArenaPoints(), Unit::getClassMask(), WorldSession::GetCurrentVendor(), Object::GetEntry(), GetHonorPoints(), VendorItemData::GetItem(), VendorItemData::GetItemCount(), GetMaxPersonalArenaRatingRequirement(), WorldObject::GetName(), GetNPCIfCanInteractWith(), GetReputationPriceDiscount(), GetReputationRank(), GetSession(), GetTeamId(), Creature::GetVendorItemCurrentCount(), Creature::GetVendorItems(), HasEnoughMoney(), ItemTemplate::HasFlag2(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, MAX_BAG_SIZE, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, MAX_MONEY_AMOUNT, VendorItem::maxcount, NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqarenaslot, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ItemExtendedCostEntry::reqpersonalarenarating, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, sConditionMgr, SendBuyError(), SendEquipError(), sItemExtendedCostStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ObjectGuid::ToString(), and UNIT_NPC_FLAG_VENDOR.

Referenced by WorldSession::HandleBuyItemInSlotOpcode(), and WorldSession::HandleBuyItemOpcode().

◆ CalcRage()

void Player::CalcRage ( uint32  damage,
bool  attacker 
)

◆ CalculateCorpseReclaimDelay()

int32 Player::CalculateCorpseReclaimDelay ( bool  load = false)
12977{
12978 Corpse* corpse = GetCorpse();
12979
12980 if (load && !corpse)
12981 return -1;
12982
12983 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12984
12985 uint32 delay;
12986
12987 if (load)
12988 {
12989 if (corpse->GetGhostTime() > m_deathExpireTime)
12990 return -1;
12991
12992 uint64 count = 0;
12993
12994 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
12995 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
12996 {
12997 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
12998
12999 if (count >= MAX_DEATH_COUNT)
13000 count = MAX_DEATH_COUNT - 1;
13001 }
13002
13003 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
13004 time_t now = GameTime::GetGameTime().count();
13005
13006 if (now >= expected_time)
13007 return -1;
13008
13009 delay = expected_time - now;
13010 }
13011 else
13012 delay = GetCorpseReclaimDelay(pvp);
13013
13014 return delay * IN_MILLISECONDS;
13015}
@ CORPSE_RESURRECTABLE_PVP
Definition Corpse.h:30
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition IWorld.h:103
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition IWorld.h:104
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition Player.cpp:140
@ PLAYER_EXTRA_PVP_DEATH
Definition Player.h:597
#define DEATH_EXPIRE_STEP
Definition Player.h:75
#define MAX_DEATH_COUNT
Definition Player.h:76
time_t const & GetGhostTime() const
Definition Corpse.h:70
CorpseType GetType() const
Definition Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition Player.cpp:12959

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, CORPSE_RESURRECTABLE_PVP, DEATH_EXPIRE_STEP, GetCorpse(), GetCorpseReclaimDelay(), GameTime::GetGameTime(), Corpse::GetGhostTime(), Corpse::GetType(), IN_MILLISECONDS, m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ CalculateMinMaxDamage()

void Player::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex 
)
overridevirtual

Implements Unit.

528{
529 // Only proto damage, not affected by any mods
530 if (damageIndex != 0)
531 {
532 minDamage = 0.0f;
533 maxDamage = 0.0f;
534
535 if (!IsInFeralForm() && CanUseAttackType(attType))
536 {
537 minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex);
538 maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex);
539 }
540
541 return;
542 }
543
544 UnitMods unitMod;
545
546 switch (attType)
547 {
548 case BASE_ATTACK:
549 default:
550 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
551 break;
552 case OFF_ATTACK:
553 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
554 break;
555 case RANGED_ATTACK:
556 unitMod = UNIT_MOD_DAMAGE_RANGED;
557 break;
558 }
559
560 float attackSpeedMod = GetAPMultiplier(attType, normalized);
561
562 float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * attackSpeedMod;
563 float basePct = GetModifierValue(unitMod, BASE_PCT);
564 float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
565 float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
566
567 float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
568 float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
569
570 if (IsAttackSpeedOverridenShapeShift()) // forms with no override on attack speed use normal weapon damage
571 {
572 uint8 lvl = GetLevel();
573 if (lvl > 60)
574 lvl = 60;
575
576 weaponMinDamage = lvl * 0.85f * attackSpeedMod;
577 weaponMaxDamage = lvl * 1.25f * attackSpeedMod;
578 }
579 else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
580 {
581 // cannot use ranged/off attack, set values to 0
582 if (attType != BASE_ATTACK)
583 {
584 minDamage = 0.0f;
585 maxDamage = 0.0f;
586 return;
587 }
588 weaponMinDamage = BASE_MINDAMAGE;
589 weaponMaxDamage = BASE_MAXDAMAGE;
590 }
591 else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
592 {
593 weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
594 weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
595 }
596
597 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
598 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
599
600 // pussywizard: crashfix (casting negative to uint => min > max => assertion in urand)
601 if (minDamage < 0.0f || minDamage > 1000000000.0f)
602 minDamage = 0.0f;
603 if (maxDamage < 0.0f || maxDamage > 1000000000.0f)
604 maxDamage = 0.0f;
605 if (minDamage > maxDamage)
606 minDamage = maxDamage;
607}
@ BASE_PCT
Definition Unit.h:127
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15494
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition Unit.cpp:15354
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17284
bool IsAttackSpeedOverridenShapeShift() const
Definition Unit.cpp:19580

References BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, Unit::CanUseAttackType(), GetAmmoDPS(), Unit::GetAPMultiplier(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetTotalAttackPowerValue(), Unit::GetWeaponDamageRange(), Unit::IsAttackSpeedOverridenShapeShift(), Unit::IsInFeralForm(), MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

◆ CalculateQuestRewardXP()

uint32 Player::CalculateQuestRewardXP ( Quest const *  quest)
1403{
1404 // apply world quest rate
1405 uint32 xp = uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
1406
1407 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
1409 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
1410 AddPct(xp, (*i)->GetAmount());
1411
1412 return xp;
1413}
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition SpellAuraDefines.h:354
T AddPct(T &base, U pct)
Definition Util.h:67
float GetQuestRate(bool isDFQuest=false)
Definition Player.cpp:16283

References AddPct(), Unit::GetAuraEffectsByType(), Unit::GetLevel(), GetQuestRate(), Quest::IsDFQuest(), SPELL_AURA_MOD_XP_QUEST_PCT, and Quest::XPValue().

Referenced by RewardQuest(), PlayerMenu::SendQuestGiverOfferReward(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5904{
5905 float percent = 100.0f;
5906
5907 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5908
5909 // faction specific auras only seem to apply to kills
5910 if (source == REPUTATION_SOURCE_KILL)
5912
5913 percent += rep > 0.f ? repMod : -repMod;
5914
5915 float rate;
5916 switch (source)
5917 {
5919 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5920 break;
5926 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5927 break;
5929 default:
5930 rate = 1.0f;
5931 break;
5932 }
5933
5934 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5935 percent *= rate;
5936
5937 if (percent <= 0.0f)
5938 return 0;
5939
5940 // Multiply result with the faction specific rate
5941 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5942 {
5943 float repRate = 0.0f;
5944 switch (source)
5945 {
5947 repRate = repData->creatureRate;
5948 break;
5950 repRate = repData->questRate;
5951 break;
5953 repRate = repData->questDailyRate;
5954 break;
5956 repRate = repData->questWeeklyRate;
5957 break;
5959 repRate = repData->questMonthlyRate;
5960 break;
5962 repRate = repData->questRepeatableRate;
5963 break;
5965 repRate = repData->spellRate;
5966 break;
5967 }
5968
5969 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5970 if (repRate <= 0.0f)
5971 return 0;
5972
5973 percent *= repRate;
5974 }
5975
5976 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5977 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5978
5979 return CalculatePct(rep, percent);
5980}
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition IWorld.h:484
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition IWorld.h:483
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition IWorld.h:485
@ REPUTATION_SOURCE_KILL
Definition Player.h:239
@ REPUTATION_SOURCE_SPELL
Definition Player.h:245
@ REPUTATION_SOURCE_QUEST
Definition Player.h:240
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition Player.h:243
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition Player.h:244
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition Player.h:242
@ REPUTATION_SOURCE_DAILY_QUEST
Definition Player.h:241
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition SpellAuraDefines.h:253
bool GetsRecruitAFriendBonus(bool forXP)
Definition Player.cpp:12728
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6070
uint8 GetGrayLevel(uint8 pl_level)
Definition Formulas.h:46
Definition ObjectMgr.h:557

References CalculatePct(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_KILL, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL, REPUTATION_SOURCE_WEEKLY_QUEST, sObjectMgr, SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, SPELL_AURA_MOD_REPUTATION_GAIN, and sWorld.

Referenced by Spell::EffectReputation(), RewardReputation(), and RewardReputation().

◆ CalculateTalentsPoints()

uint32 Player::CalculateTalentsPoints ( ) const
13660{
13661 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13662
13663 uint32 talentPointsForLevel = 0;
13665 {
13666 talentPointsForLevel = base_talent;
13667 }
13668 else
13669 {
13670 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13671 talentPointsForLevel += m_questRewardTalentCount;
13672
13673 if (talentPointsForLevel > base_talent)
13674 {
13675 talentPointsForLevel = base_talent;
13676 }
13677 }
13678
13679 talentPointsForLevel += m_extraBonusTalentCount;
13680 sScriptMgr->OnCalculateTalentsPoints(this, talentPointsForLevel);
13681 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13682}
@ RATE_TALENT
Definition IWorld.h:512
@ CLASS_CONTEXT_TALENT_POINT_CALC
Definition UnitDefines.h:233

References CLASS_CONTEXT_TALENT_POINT_CALC, CLASS_DEATH_KNIGHT, Unit::GetLevel(), WorldLocation::GetMapId(), IsClass(), m_extraBonusTalentCount, m_questRewardTalentCount, RATE_TALENT, sScriptMgr, and sWorld.

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

bool Player::CanAddQuest ( Quest const *  quest,
bool  msg 
)
265{
266 if (!SatisfyQuestLog(msg))
267 return false;
268
269 uint32 srcitem = quest->GetSrcItemId();
270 if (srcitem > 0)
271 {
272 uint32 count = quest->GetSrcItemCount();
273 ItemPosCountVec dest;
274 InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
275
276 // player already have max number (in most case 1) source item, no additional item needed and quest can be added.
278 return true;
279 else if (msg2 != EQUIP_ERR_OK)
280 {
281 SendEquipError(msg2, nullptr, nullptr, srcitem);
282 PlayDirectSound(QUEST_SOUND_FAILURE, this); // Play failure sound
283 return false;
284 }
285 }
286 return true;
287}
@ EQUIP_ERR_CANT_CARRY_MORE_OF_THIS
Definition Item.h:64
@ QUEST_SOUND_FAILURE
Definition Player.h:250
bool SatisfyQuestLog(bool msg)
Definition PlayerQuest.cpp:984
void PlayDirectSound(uint32 sound_id, Player *target=nullptr)
Definition Object.cpp:2905

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, WorldObject::PlayDirectSound(), QUEST_SOUND_FAILURE, SatisfyQuestLog(), and SendEquipError().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ CanAlwaysSee()

bool Player::CanAlwaysSee ( WorldObject const *  obj) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11490{
11491 // Always can see self
11492 if (m_mover == obj)
11493 return true;
11494
11496 if (obj->GetGUID() == guid)
11497 return true;
11498
11499 return false;
11500}
@ PLAYER_FARSIGHT
Definition UpdateFields.h:334

References Object::GetGUID(), Object::GetGuidValue(), m_mover, and PLAYER_FARSIGHT.

◆ CanBankItem()

InventoryResult Player::CanBankItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
2033{
2034 if (!pItem)
2036
2037 uint32 count = pItem->GetCount();
2038
2039 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2040 ItemTemplate const* pProto = pItem->GetTemplate();
2041 if (!pProto)
2043
2044 // Xinef: Removed next loot generated check
2045 if (pItem->GetGUID() == GetLootGUID())
2047
2048 if (pItem->IsBindedNotWith(this))
2050
2051 // Currency tokens are not supposed to be swapped out of their hidden bag
2052 uint8 pItemslot = pItem->GetSlot();
2053 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2054 {
2055 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2056 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2058 }
2059
2060 // check count of items (skip for auto move for same player from bank)
2062 if (res != EQUIP_ERR_OK)
2063 return res;
2064
2065 // in specific slot
2066 if (bag != NULL_BAG && slot != NULL_SLOT)
2067 {
2068 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2069 {
2070 if (!pItem->IsBag())
2072
2075
2076 res = CanUseItem(pItem, not_loading);
2077 if (res != EQUIP_ERR_OK)
2078 return res;
2079 }
2080
2081 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2082 if (res != EQUIP_ERR_OK)
2083 return res;
2084
2085 if (count == 0)
2086 return EQUIP_ERR_OK;
2087 }
2088
2089 // not specific slot or have space for partly store only in specific slot
2090
2091 // in specific bag
2092 if (bag != NULL_BAG)
2093 {
2094 if (pItem->IsNotEmptyBag())
2096
2097 // search stack in bag for merge to
2098 if (pProto->Stackable != 1)
2099 {
2100 if (bag == INVENTORY_SLOT_BAG_0)
2101 {
2102 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2103 if (res != EQUIP_ERR_OK)
2104 return res;
2105
2106 if (count == 0)
2107 return EQUIP_ERR_OK;
2108 }
2109 else
2110 {
2111 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2112 if (res != EQUIP_ERR_OK)
2113 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2114
2115 if (res != EQUIP_ERR_OK)
2116 return res;
2117
2118 if (count == 0)
2119 return EQUIP_ERR_OK;
2120 }
2121 }
2122
2123 // search free slot in bag
2124 if (bag == INVENTORY_SLOT_BAG_0)
2125 {
2126 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2127 if (res != EQUIP_ERR_OK)
2128 return res;
2129
2130 if (count == 0)
2131 return EQUIP_ERR_OK;
2132 }
2133 else
2134 {
2135 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2136 if (res != EQUIP_ERR_OK)
2137 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2138
2139 if (res != EQUIP_ERR_OK)
2140 return res;
2141
2142 if (count == 0)
2143 return EQUIP_ERR_OK;
2144 }
2145 }
2146
2147 // not specific bag or have space for partly store only in specific bag
2148
2149 // search stack for merge to
2150 if (pProto->Stackable != 1)
2151 {
2152 // in slots
2153 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2154 if (res != EQUIP_ERR_OK)
2155 return res;
2156
2157 if (count == 0)
2158 return EQUIP_ERR_OK;
2159
2160 // in special bags
2161 if (pProto->BagFamily)
2162 {
2163 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2164 {
2165 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
2166 if (res != EQUIP_ERR_OK)
2167 continue;
2168
2169 if (count == 0)
2170 return EQUIP_ERR_OK;
2171 }
2172 }
2173
2174 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2175 {
2176 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2177 if (res != EQUIP_ERR_OK)
2178 continue;
2179
2180 if (count == 0)
2181 return EQUIP_ERR_OK;
2182 }
2183 }
2184
2185 // search free place in special bag
2186 if (pProto->BagFamily)
2187 {
2188 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2189 {
2190 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2191 if (res != EQUIP_ERR_OK)
2192 continue;
2193
2194 if (count == 0)
2195 return EQUIP_ERR_OK;
2196 }
2197 }
2198
2199 // search free space
2200 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2201 if (res != EQUIP_ERR_OK)
2202 return res;
2203
2204 if (count == 0)
2205 return EQUIP_ERR_OK;
2206
2207 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2208 {
2209 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2210 if (res != EQUIP_ERR_OK)
2211 continue;
2212
2213 if (count == 0)
2214 return EQUIP_ERR_OK;
2215 }
2216 return EQUIP_ERR_BANK_FULL;
2217}
@ EQUIP_ERR_ALREADY_LOOTED
Definition Item.h:96
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition Item.h:79
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition Item.h:81
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition Item.h:52
@ EQUIP_ERR_BANK_FULL
Definition Item.h:98
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition Item.h:70
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition Item.h:68
@ BANK_SLOT_BAG_START
Definition Player.h:722
@ BANK_SLOT_ITEM_START
Definition Player.h:716
@ BANK_SLOT_ITEM_END
Definition Player.h:717
bool IsBindedNotWith(Player const *player) const
Definition Item.cpp:1132
bool IsBag() const
Definition Item.h:254
bool IsNotEmptyBag() const
Definition Item.cpp:311
uint8 GetBankBagSlotCount() const
Definition Player.h:1282
ObjectGuid GetLootGUID() const
Definition Player.h:2000
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition Player.h:1289
InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition PlayerStorage.cpp:1050
InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition PlayerStorage.cpp:980
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition PlayerStorage.cpp:909
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition PlayerStorage.cpp:2219
uint32 BagFamily
Definition ItemTemplate.h:679
int32 Stackable
Definition ItemTemplate.h:645

References ItemTemplate::BagFamily, BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CanUseItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_BANK_FULL, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, GetBankBagSlotCount(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetLootGUID(), WorldObject::GetName(), Item::GetSlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, Item::IsBag(), Item::IsBindedNotWith(), Item::IsNotEmptyBag(), ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, NULL_BAG, NULL_SLOT, ItemTemplate::Stackable, ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), SplitItem(), and SwapItem().

◆ CanBlock()

bool Player::CanBlock ( ) const
inline
2193{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13282{
13283 return (!HasStealthAura() && // not stealthed
13284 !HasInvisibilityAura() && // not invisible
13285 IsAlive() // live player
13286 );
13287}
bool HasStealthAura() const
Definition Unit.h:1755
bool HasInvisibilityAura() const
Definition Unit.h:1757

References Unit::HasInvisibilityAura(), Unit::HasStealthAura(), and Unit::IsAlive().

◆ CanCompleteQuest()

bool Player::CanCompleteQuest ( uint32  quest_id,
const QuestStatusData q_savedStatus = nullptr 
)
290{
291 if (quest_id)
292 {
293 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
294 if (!qInfo)
295 return false;
296
297 // Xinef: take seasonals into account
298 if (!qInfo->IsRepeatable() && !qInfo->IsSeasonal() && IsQuestRewarded(quest_id))
299 return false; // not allow re-complete quest
300
301 // auto complete quest
302 if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false))
303 return true;
304
305 QuestStatusData q_status;
306 if (q_savedStatus)
307 q_status = *q_savedStatus;
308 else
309 {
310 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
311 if (itr == m_QuestStatus.end())
312 return false;
313
314 q_status = itr->second;
315 }
316
317 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
318 {
320 {
321 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
322 {
323 if (qInfo->RequiredItemCount[i] != 0 && q_status.ItemCount[i] < qInfo->RequiredItemCount[i])
324 return false;
325 }
326 }
327
329 {
330 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
331 {
332 if (qInfo->RequiredNpcOrGo[i] == 0)
333 continue;
334
335 if (qInfo->RequiredNpcOrGoCount[i] != 0 && q_status.CreatureOrGOCount[i] < qInfo->RequiredNpcOrGoCount[i])
336 return false;
337 }
338 }
339
341 if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain())
342 return false;
343
345 return false;
346
347 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0)
348 return false;
349
350 if (qInfo->GetRewOrReqMoney() < 0)
351 {
352 if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney()))
353 return false;
354 }
355
356 uint32 repFacId = qInfo->GetRepObjectiveFaction();
357 if (repFacId && GetReputationMgr().GetReputation(repFacId) < qInfo->GetRepObjectiveValue())
358 return false;
359
360 return true;
361 }
362 }
363 return false;
364}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition QuestDef.h:161
bool CanTakeQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:251
uint32 GetReputation(uint32 factionentry) const
Definition Player.cpp:15375
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1638
bool HasSpecialFlag(uint32 flag) const
Definition QuestDef.h:224
int32 GetRepObjectiveValue() const
Definition QuestDef.h:240
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:304
uint32 GetRepObjectiveFaction() const
Definition QuestDef.h:239
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:305
bool IsRepeatable() const
Definition QuestDef.h:283
bool IsAutoComplete() const
Definition QuestDef.cpp:274
uint32 GetPlayersSlain() const
Definition QuestDef.h:254
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:301
int32 GetRewOrReqMoney(uint8 playerLevel=0) const
Definition QuestDef.cpp:238
bool IsSeasonal() const
Definition QuestDef.h:290
uint32 GetQuestMethod() const
Definition QuestDef.h:229

References CanTakeQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Quest::GetPlayersSlain(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveValue(), GetReputation(), GetReputationMgr(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QuestStatusData::ItemCount, m_QuestStatus, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, QuestStatusData::Status, and QuestStatusData::Timer.

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), and TalkedToCreature().

◆ CanCompleteRepeatableQuest()

bool Player::CanCompleteRepeatableQuest ( Quest const *  quest)
367{
368 // Solve problem that player don't have the quest and try complete it.
369 // if repeatable she must be able to complete event if player don't have it.
370 // Seem that all repeatable quest are DELIVER Flag so, no need to add more.
371 if (!CanTakeQuest(quest, false))
372 return false;
373
374 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
375 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
376 if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i]))
377 return false;
378
379 if (!CanRewardQuest(quest, false))
380 return false;
381
382 return true;
383}
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:385

References CanRewardQuest(), CanTakeQuest(), HasItemCount(), Quest::HasSpecialFlag(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), and SendPreparedQuest().

◆ CanEnterWater()

bool Player::CanEnterWater ( ) const
inlineoverridevirtual

Implements Unit.

2578{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1806{
1807 dest = 0;
1808 if (pItem)
1809 {
1810 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1811 ItemTemplate const* pProto = pItem->GetTemplate();
1812 if (pProto)
1813 {
1814 if (!sScriptMgr->CanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1816
1817 // item used
1818 if (pItem->m_lootGenerated)
1820
1821 if (pItem->IsBindedNotWith(this))
1823
1824 // check count of items (skip for auto move for same player from bank)
1826 if (res != EQUIP_ERR_OK)
1827 return res;
1828
1829 // check this only in game
1830 if (not_loading)
1831 {
1832 // May be here should be more stronger checks; STUNNED checked
1833 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1836
1837 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1838 // - combat
1839 // - in-progress arenas
1840 if (!pProto->CanChangeEquipStateInCombat())
1841 {
1842 if (IsInCombat())
1844
1845 if (Battleground* bg = GetBattleground())
1846 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1848 }
1849
1850 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0)
1851 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1852
1853 if (IsNonMeleeSpellCast(false))
1855 }
1856
1858 // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
1859 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1861
1862 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1863 if (eslot == NULL_SLOT)
1865
1866 // Xinef: dont allow to equip items on disarmed slot
1867 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1869
1870 res = CanUseItem(pItem, not_loading);
1871 if (res != EQUIP_ERR_OK)
1872 return res;
1873
1874 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1876
1877 // if we are swapping 2 equipped items, CanEquipUniqueItem check
1878 // should ignore the item we are trying to swap, and not the
1879 // destination item. CanEquipUniqueItem should ignore destination
1880 // item only when we are swapping weapon from bag
1881 uint8 ignore = uint8(NULL_SLOT);
1882 switch (eslot)
1883 {
1885 ignore = EQUIPMENT_SLOT_OFFHAND;
1886 break;
1888 ignore = EQUIPMENT_SLOT_MAINHAND;
1889 break;
1891 ignore = EQUIPMENT_SLOT_FINGER2;
1892 break;
1894 ignore = EQUIPMENT_SLOT_FINGER1;
1895 break;
1897 ignore = EQUIPMENT_SLOT_TRINKET2;
1898 break;
1900 ignore = EQUIPMENT_SLOT_TRINKET1;
1901 break;
1902 }
1903
1904 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1905 ignore = eslot;
1906
1907 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1908 if (res2 != EQUIP_ERR_OK)
1909 return res2;
1910
1911 // check unique-equipped special item classes
1912 if (pProto->Class == ITEM_CLASS_QUIVER)
1914 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1915 if (pBag != pItem)
1916 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1917 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1918 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1921
1922 uint32 type = pProto->InventoryType;
1923
1924 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1925 {
1926 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1927 // xinef: same for fishing poles
1930
1931 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1932 {
1933 if (!CanDualWield())
1935 }
1936 else if (type == INVTYPE_2HWEAPON)
1937 {
1938 if (!CanDualWield() || !CanTitanGrip())
1940 }
1941
1942 // Do not allow offhand with main hand polearm, staff or fishing pole
1944 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
1945 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
1946 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
1947 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
1949
1950 if (IsTwoHandUsed())
1952 }
1953
1954 // equip two-hand weapon case (with possible unequip 2 items)
1955 if (type == INVTYPE_2HWEAPON)
1956 {
1957 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1958 {
1959 if (!CanTitanGrip())
1961 }
1962 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1964
1966 {
1967 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1969 ItemPosCountVec off_dest;
1970 if (offItem && (!not_loading ||
1972 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
1974 }
1975 }
1976 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
1977 return EQUIP_ERR_OK;
1978 }
1979 }
1980
1982}
@ STATUS_IN_PROGRESS
Definition Battleground.h:202
#define DEFAULT_MAX_LEVEL
Definition DBCEnums.h:35
@ INVTYPE_RELIC
Definition ItemTemplate.h:284
@ ITEM_SUBCLASS_AMMO_POUCH
Definition ItemTemplate.h:481
@ ITEM_CLASS_QUIVER
Definition ItemTemplate.h:302
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition Item.h:89
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition Item.h:61
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition Item.h:56
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition Item.h:124
@ EQUIP_ERR_NOT_IN_COMBAT
Definition Item.h:107
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition Item.h:60
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition Item.h:108
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition Item.h:86
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition Item.h:80
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition Item.h:84
@ EQUIP_ERR_INVENTORY_FULL
Definition Item.h:97
@ EQUIPMENT_SLOT_FINGER1
Definition Player.h:690
@ EQUIPMENT_SLOT_FINGER2
Definition Player.h:691
@ EQUIPMENT_SLOT_TRINKET1
Definition Player.h:692
@ EQUIPMENT_SLOT_TRINKET2
Definition Player.h:693
Definition Battleground.h:303
bool m_lootGenerated
Definition Item.h:321
Definition Player.h:1081
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition PlayerStorage.cpp:1984
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition Player.cpp:13825
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12233
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition PlayerStorage.cpp:125
bool CanChangeEquipStateInCombat() const
Definition ItemTemplate.h:707
uint32 ScalingStatDistribution
Definition ItemTemplate.h:649
uint32 SubClass
Definition ItemTemplate.h:622

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanDualWield(), CanEquipUniqueItem(), CanStoreItem(), CanTakeMoreSimilarItems(), CanTitanGrip(), CanUnequipItem(), Unit::CanUseAttackType(), CanUseItem(), ItemTemplate::Class, DEFAULT_MAX_LEVEL, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_DUAL_WIELD, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_STUNNED, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, FindEquipSlot(), GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Unit::GetLevel(), Item::GetTemplate(), Unit::HasUnitState(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_RELIC, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, Item::IsBindedNotWith(), Unit::IsInCombat(), Unit::IsNonMeleeSpellCast(), IsTwoHandUsed(), ITEM_CLASS_QUIVER, ITEM_CLASS_WEAPON, ITEM_SUBCLASS_AMMO_POUCH, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LOG_DEBUG, Item::m_lootGenerated, m_weaponChangeTimer, ScalingStatDistributionEntry::MaxLevel, NULL_BAG, NULL_SLOT, ItemTemplate::ScalingStatDistribution, sScalingStatDistributionStore, sScriptMgr, STATUS_IN_PROGRESS, ItemTemplate::SubClass, and UNIT_STATE_STUNNED.

Referenced by _LoadInventory(), CanEquipNewItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleEquipmentSetUse(), SplitItem(), and SwapItem().

◆ CanEquipNewItem()

InventoryResult Player::CanEquipNewItem ( uint8  slot,
uint16 dest,
uint32  item,
bool  swap 
) const
1792{
1793 dest = 0;
1794 Item* pItem = Item::CreateItem(item, 1, this);
1795 if (pItem)
1796 {
1797 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1798 delete pItem;
1799 return result;
1800 }
1801
1803}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087

References CanEquipItem(), Item::CreateItem(), and EQUIP_ERR_ITEM_NOT_FOUND.

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ CanEquipUniqueItem() [1/2]

InventoryResult Player::CanEquipUniqueItem ( Item pItem,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13826{
13827 ItemTemplate const* pProto = pItem->GetTemplate();
13828
13829 // proto based limitations
13830 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13831 return res;
13832
13833 // check unique-equipped on gems
13834 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13835 {
13836 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13837 if (!enchant_id)
13838 continue;
13839 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13840 if (!enchantEntry)
13841 continue;
13842
13843 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13844 if (!pGem)
13845 continue;
13846
13847 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13848 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13850
13851 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13852 return res;
13853 }
13854
13855 return EQUIP_ERR_OK;
13856}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition Item.cpp:1033
uint32 ItemLimitCategory
Definition ItemTemplate.h:687
uint32 GemID
Definition DBCStructure.h:1851

References CanEquipUniqueItem(), EQUIP_ERR_OK, SpellItemEnchantmentEntry::GemID, Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), Item::GetTemplate(), Item::IsEquipped(), ItemTemplate::ItemLimitCategory, sObjectMgr, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by CanEquipItem(), CanEquipUniqueItem(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13859{
13860 // check unique-equipped on item
13861 if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE))
13862 {
13863 // there is an equip limit on this item
13864 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13866 }
13867
13868 // check unique-equipped limit
13869 if (itemProto->ItemLimitCategory)
13870 {
13871 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13872 if (!limitEntry)
13874
13875 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13876
13877 if (limit_count > limitEntry->maxCount)
13879
13880 // there is an equip limit on this item
13881 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13883 }
13884
13885 return EQUIP_ERR_OK;
13886}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition ItemTemplate.h:166
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition Item.h:135
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition Item.h:114
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition Item.h:121
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition PlayerStorage.cpp:728
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition PlayerStorage.cpp:766
Definition DBCStructure.h:1195
uint32 maxCount
Definition DBCStructure.h:1199

References EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, EQUIP_ERR_OK, ItemTemplate::HasFlag(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), ITEM_FLAG_UNIQUE_EQUIPPABLE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemLimitCategoryEntry::maxCount, and sItemLimitCategoryStore.

◆ CanExecutePendingSpellCastRequest()

bool Player::CanExecutePendingSpellCastRequest ( SpellInfo const *  spellInfo)
2304{
2305 if (GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))
2306 return false;
2307
2308 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2309 return false;
2310
2312 if (Spell* spell = GetCurrentSpell(spellSlot))
2313 {
2314 bool autoshot = spell->m_spellInfo->IsAutoRepeatRangedSpell();
2315 if (IsNonMeleeSpellCast(false, true, true, autoshot))
2316 return false;
2317 }
2318 return true;
2319}
CurrentSpellTypes
Definition Unit.h:536
@ CURRENT_MELEE_SPELL
Definition Unit.h:537
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition Player.h:1812
uint32 GetSpellQueueWindow() const
Definition PlayerUpdates.cpp:2298
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition Player.cpp:16381

References CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and Unit::IsNonMeleeSpellCast().

Referenced by WorldSession::HandleCastSpellOpcode(), WorldSession::HandleUseItemOpcode(), and ProcessSpellQueue().

◆ CanFly()

bool Player::CanFly ( ) const
inlineoverridevirtual

Implements Unit.

@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:389
MovementInfo m_movementInfo
Definition Object.h:607
bool HasMovementFlag(uint32 flag) const
Definition Object.h:339

References MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, and MOVEMENTFLAG_CAN_FLY.

Referenced by gm_commandscript::HandleGMFlyCommand().

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
)
13685{
13686 if (!sScriptMgr->OnCanPlayerFlyInZone(this, mapid,zone,bySpell))
13687 {
13688 return false;
13689 }
13690
13691 // continent checked in SpellInfo::CheckLocation at cast and area update
13692 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13693 if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13694 {
13695 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13696 {
13697 return false;
13698 }
13699 }
13700
13701 return true;
13702}
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition DBCStores.cpp:703
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition SharedDefines.h:663

References GetVirtualMapForMapAndZone(), SpellInfo::HasAttribute(), HasSpell(), SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT, and sScriptMgr.

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2082{
2083 switch (questGiver->GetTypeId())
2084 {
2085 case TYPEID_UNIT:
2086 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2087 case TYPEID_GAMEOBJECT:
2088 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2089 case TYPEID_PLAYER:
2090 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2091 case TYPEID_ITEM:
2092 return IsAlive();
2093 default:
2094 break;
2095 }
2096 return false;
2097}
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1562
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const
Definition Player.cpp:2156

References GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectIfCanInteractWith(), Object::GetGUID(), GetNPCIfCanInteractWith(), Object::GetTypeId(), Unit::IsAlive(), Object::ToPlayer(), TYPEID_GAMEOBJECT, TYPEID_ITEM, TYPEID_PLAYER, TYPEID_UNIT, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), and WorldSession::HandleQuestgiverRequestRewardOpcode().

◆ CanJoinConstantChannelInZone()

bool Player::CanJoinConstantChannelInZone ( ChatChannelsEntry const *  channel,
AreaTableEntry const *  zone 
)
4996{
4997 // Player can join LFG anywhere
4998 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4999 return true;
5000
5001 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
5002 return false;
5003
5004 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
5005 return false;
5006
5007 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
5008 return false;
5009
5010 return true;
5011}
@ CHANNEL_DBC_FLAG_CITY_ONLY
Definition Channel.h:97
@ CHANNEL_DBC_FLAG_GUILD_REQ
Definition Channel.h:100
@ CHANNEL_DBC_FLAG_ZONE_DEP
Definition Channel.h:94
@ CHANNEL_DBC_FLAG_LFG
Definition Channel.h:101
@ AREA_FLAG_ARENA_INSTANCE
Definition DBCEnums.h:250
@ AREA_FLAG_SLAVE_CAPITAL
Definition DBCEnums.h:237
@ CONFIG_LFG_LOCATION_ALL
Definition IWorld.h:157
uint32 GetGuildId() const
Definition Player.h:1908

References AREA_FLAG_ARENA_INSTANCE, AREA_FLAG_SLAVE_CAPITAL, CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GUILD_REQ, CHANNEL_DBC_FLAG_LFG, CHANNEL_DBC_FLAG_ZONE_DEP, CONFIG_LFG_LOCATION_ALL, AreaTableEntry::flags, ChatChannelsEntry::flags, GetGuildId(), and sWorld.

Referenced by UpdateLocalChannels().

◆ CanJoinToBattleground()

bool Player::CanJoinToBattleground ( ) const
11397{
11398 // check Deserter debuff
11399 if (HasAura(26013))
11400 return false;
11401
11402 return true;
11403}
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5754

References Unit::HasAura().

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattleFieldPortOpcode(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ CanKnockback()

bool Player::CanKnockback ( )
inline
2507{ return m_canKnockback; }

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12601{
12602 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12604 return true;
12605
12606 // Check no reagent use mask
12607 flag96 noReagentMask;
12608 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12609 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12610 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12611 if (spellInfo->SpellFamilyFlags & noReagentMask)
12612 return true;
12613
12614 return false;
12615}
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition SharedDefines.h:568
@ UNIT_FLAG_PREPARATION
Definition UnitDefines.h:255
@ PLAYER_NO_REAGENT_COST_1
Definition UpdateFields.h:387

References Object::GetUInt32Value(), SpellInfo::HasAttribute(), Unit::HasUnitFlag(), PLAYER_NO_REAGENT_COST_1, SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA, SpellInfo::SpellFamilyFlags, and UNIT_FLAG_PREPARATION.

Referenced by Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), and Spell::TakeReagents().

◆ CanParry()

bool Player::CanParry ( ) const
inline

◆ CanPetResurrect()

bool Player::CanPetResurrect ( )
9200{
9201 PetStable* const petStable = GetPetStable();
9202 if (!petStable)
9203 {
9204 // No pets
9205 return false;
9206 }
9207
9208 auto const& currectPet = petStable->CurrentPet;
9209 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9210
9211 if (!currectPet && !unslottedHunterPet)
9212 {
9213 // No pets
9214 return false;
9215 }
9216
9217 // Check current pet
9218 if (currectPet && !currectPet->Health)
9219 {
9220 return true;
9221 }
9222
9223 // Check dismiss/unslotted hunter pet
9224 if (unslottedHunterPet && !unslottedHunterPet->Health)
9225 {
9226 return true;
9227 }
9228
9229 return false;
9230}
Definition PetDefines.h:206
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:234
Optional< PetInfo > CurrentPet
Definition PetDefines.h:229
PetStable * GetPetStable()
Definition Player.h:1219

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11406{
11407 // a player can complain about 15 people per 5 minutes
11408 if (m_bgData.bgAfkReportedCount++ >= 15)
11409 return false;
11410
11411 return true;
11412}
BGData m_bgData
Definition Player.h:2688
uint8 bgAfkReportedCount
Definition Player.h:1048

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanRequestSpellCast()

bool Player::CanRequestSpellCast ( SpellInfo const *  spellInfo)
2330{
2331 if (!sWorld->getBoolConfig(CONFIG_SPELL_QUEUE_ENABLED))
2332 return false;
2333
2334 // Check for existing cast request with the same category
2335 if (GetCastRequest(spellInfo->GetCategory()))
2336 return false;
2337
2338 if (GetGlobalCooldownMgr().GetGlobalCooldown(spellInfo) > GetSpellQueueWindow())
2339 return false;
2340
2341 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2342 return false;
2343
2344 // If there is an existing cast that will last longer than the allowable
2345 // spell queue window, then we can't request a new spell cast
2347 if (Spell* spell = GetCurrentSpell(spellSlot))
2348 if (spell->GetCastTimeRemaining() > static_cast<int32>(GetSpellQueueWindow()))
2349 return false;
2350
2351 return true;
2352}
@ CONFIG_SPELL_QUEUE_ENABLED
Definition IWorld.h:186
const PendingSpellCastRequest * GetCastRequest(uint32 category) const
Definition PlayerUpdates.cpp:2321

References CONFIG_SPELL_QUEUE_ENABLED, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, GetCastRequest(), SpellInfo::GetCategory(), Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and sWorld.

Referenced by WorldSession::HandleCastSpellOpcode(), and WorldSession::HandleUseItemOpcode().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14293{
14295 {
14296 if (CanSeeDKPet())
14297 return true;
14298 else if (spellid == 52150) // Raise Dead
14299 return false;
14300 }
14301
14303 {
14304 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14305 return true;
14306 }
14307
14309 {
14310 return true;
14311 }
14312
14313 return HasSpell(spellid);
14314}
@ CLASS_CONTEXT_PET
Definition UnitDefines.h:236
bool CanSeeDKPet() const
Definition Player.h:2604

References CanSeeDKPet(), CLASS_CONTEXT_PET, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, Unit::HasAura(), HasSpell(), and IsClass().

Referenced by spell_gen_pet_summoned::HandleScript(), and ResummonPetTemporaryUnSummonedIfAny().

◆ CanRewardQuest() [1/2]

bool Player::CanRewardQuest ( Quest const *  quest,
bool  msg 
)
386{
387 // not auto complete quest and not completed quest (only cheating case, then ignore without message)
388 if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
389 return false;
390
391 // daily quest can't be rewarded (25 daily quest already completed)
392 if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestMonth(quest, true) || !SatisfyQuestSeasonal(quest, true))
393 return false;
394
395 // rewarded and not repeatable quest (only cheating case, then ignore without message)
396 if (GetQuestRewardStatus(quest->GetQuestId()))
397 return false;
398
399 // prevent receive reward with quest items in bank
400 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
401 {
402 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
403 {
404 if (quest->RequiredItemCount[i] != 0 &&
405 GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i])
406 {
407 if (msg)
408 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]);
409 return false;
410 }
411 }
412 }
413
414 // prevent receive reward with low money and GetRewOrReqMoney() < 0
415 if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney()))
416 return false;
417
418 return true;
419}
bool SatisfyQuestDay(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1268
bool SatisfyQuestMonth(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1326
bool SatisfyQuestSeasonal(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1311
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1430
bool SatisfyQuestWeek(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1302

References EQUIP_ERR_ITEM_NOT_FOUND, GetItemCount(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestRewardStatus(), GetQuestStatus(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), Quest::IsDFQuest(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_COMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, SatisfyQuestDay(), SatisfyQuestMonth(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), and SendEquipError().

Referenced by CanCompleteRepeatableQuest(), CanRewardQuest(), lfg::LFGMgr::FinishDungeon(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), npc_elder_clearwater::OnGossipHello(), and SendPreparedQuest().

◆ CanRewardQuest() [2/2]

bool Player::CanRewardQuest ( Quest const *  quest,
uint32  reward,
bool  msg 
)
469{
470 // prevent receive reward with quest items in bank or for not completed quest
471 if (!CanRewardQuest(quest, msg))
472 return false;
473
474 ItemPosCountVec dest;
475 if (quest->GetRewChoiceItemsCount() > 0)
476 {
477 if (quest->RewardChoiceItemId[reward])
478 {
479 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]);
480 if (res != EQUIP_ERR_OK)
481 {
482 SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]);
483 return false;
484 }
485 }
486 }
487
488 if (quest->GetRewItemsCount() > 0)
489 {
490 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
491 {
492 if (quest->RewardItemId[i])
493 {
494 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]);
495 if (res != EQUIP_ERR_OK)
496 {
497 SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]);
498 return false;
499 }
500 }
501 }
502 }
503
504 return true;
505}

References CanRewardQuest(), CanStoreNewItem(), EQUIP_ERR_OK, Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), NULL_BAG, NULL_SLOT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, and SendEquipError().

◆ CanRollForItemInLFG()

InventoryResult Player::CanRollForItemInLFG ( ItemTemplate const *  item,
WorldObject const *  lootedObject 
) const
2338{
2339 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2340 return EQUIP_ERR_OK; // not in LFG group
2341
2342 // check if looted object is inside the lfg dungeon
2343 Map const* map = lootedObject->GetMap();
2344 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2345 return EQUIP_ERR_OK;
2346
2347 if (!proto)
2349 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2350
2351 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2352 {
2358 }; //Copy from function Item::GetSkill()
2359
2360 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2362
2363 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2365
2366 if (proto->RequiredSkill != 0)
2367 {
2368 if (!GetSkillValue(proto->RequiredSkill))
2370 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2372 }
2373
2374 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2376
2377 if (proto->Class == ITEM_CLASS_ARMOR)
2378 {
2379 // Check for shields
2380 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
2384 {
2386 }
2387
2388 // Check for librams.
2390 {
2392 }
2393
2394 // CHeck for idols.
2396 {
2398 }
2399
2400 // Check for totems.
2402 {
2404 }
2405
2406 // Check for sigils.
2408 {
2410 }
2411 }
2412
2413 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2414 proto->InventoryType != INVTYPE_CLOAK)
2415 {
2416 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2418 {
2419 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2420 }
2422 {
2423 if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
2424 {
2426 }
2427 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2428 }
2430 {
2431 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2432 }
2434 {
2435 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2436 }
2438 {
2439 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2440 {
2442 }
2443 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2444 }
2445
2446 if (proto->SubClass > subclassToCompare)
2447 {
2449 }
2450 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2451 {
2452 if (proto->SubClass < subclassToCompare)
2453 {
2455 }
2456 }
2457 }
2458
2459 return EQUIP_ERR_OK;
2460}
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition IWorld.h:416
@ INVTYPE_CLOAK
Definition ItemTemplate.h:272
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition ItemTemplate.h:395
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition ItemTemplate.h:397
@ ITEM_SUBCLASS_ARMOR_MISC
Definition ItemTemplate.h:390
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition ItemTemplate.h:398
#define MAX_ITEM_SUBCLASS_WEAPON
Definition ItemTemplate.h:371
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition Item.h:49
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition Item.h:55
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition Item.h:57
#define sLFGMgr
Definition LFGMgr.h:641
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ SKILL_BOWS
Definition SharedDefines.h:2873
@ SKILL_MACES
Definition SharedDefines.h:2877
@ SKILL_WANDS
Definition SharedDefines.h:2941
@ SKILL_GUNS
Definition SharedDefines.h:2874
@ SKILL_CROSSBOWS
Definition SharedDefines.h:2940
@ SKILL_THROWN
Definition SharedDefines.h:2914
@ SKILL_FISHING
Definition SharedDefines.h:2957
@ SKILL_SWORDS
Definition SharedDefines.h:2871
@ SKILL_DAGGERS
Definition SharedDefines.h:2913
@ SKILL_2H_AXES
Definition SharedDefines.h:2912
@ SKILL_POLEARMS
Definition SharedDefines.h:2942
@ SKILL_2H_SWORDS
Definition SharedDefines.h:2878
@ SKILL_FIST_WEAPONS
Definition SharedDefines.h:2966
@ SKILL_2H_MACES
Definition SharedDefines.h:2906
@ SKILL_AXES
Definition SharedDefines.h:2872
@ SKILL_STAVES
Definition SharedDefines.h:2894
@ SKILL_ASSASSINATION
Definition SharedDefines.h:2946
@ CLASS_CONTEXT_EQUIP_SHIELDS
Definition UnitDefines.h:239
@ CLASS_CONTEXT_EQUIP_RELIC
Definition UnitDefines.h:238
@ CLASS_CONTEXT_EQUIP_ARMOR_CLASS
Definition UnitDefines.h:240
uint32 GetId() const
Definition Map.h:377
Difficulty GetDifficulty() const
Definition Map.h:441
uint32 getRaceMask() const
Definition Unit.h:804

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_CONTEXT_EQUIP_RELIC, CLASS_CONTEXT_EQUIP_SHIELDS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_PALADIN, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARRIOR, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, IsClass(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_MOD_SPELL_POWER, ITEM_SUBCLASS_ARMOR_BUCKLER, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ItemTemplate::ItemLevel, MAX_ITEM_SUBCLASS_WEAPON, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, SKILL_2H_AXES, SKILL_2H_MACES, SKILL_2H_SWORDS, SKILL_ASSASSINATION, SKILL_AXES, SKILL_BOWS, SKILL_CROSSBOWS, SKILL_DAGGERS, SKILL_FISHING, SKILL_FIST_WEAPONS, SKILL_GUNS, SKILL_MACES, SKILL_POLEARMS, SKILL_STAVES, SKILL_SWORDS, SKILL_THROWN, SKILL_WANDS, sLFGMgr, ItemTemplate::SubClass, and sWorld.

Referenced by Group::NeedBeforeGreed().

◆ CanSeeDKPet()

bool Player::CanSeeDKPet ( ) const
inline

◆ CanSeeSpellClickOn()

bool Player::CanSeeSpellClickOn ( Creature const *  creature) const
14317{
14318 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14319 return false;
14320
14321 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14322 if (clickPair.first == clickPair.second)
14323 return true;
14324
14325 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14326 {
14327 if (!itr->second.IsFitToRequirements(this, c))
14328 return false;
14329
14330 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14331 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14332 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14333 return true;
14334 }
14335
14336 return false;
14337}
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:339
Definition ConditionMgr.h:182

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, sObjectMgr, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Unit::PatchValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
238{
239 if (!sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
240 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
241 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
242 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
243 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
244 {
245 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
246 }
247
248 return false;
249}
#define sDisableMgr
Definition DisableMgr.h:87
@ DISABLE_TYPE_QUEST
Definition DisableMgr.h:28
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition IWorld.h:288
bool SatisfyQuestNextChain(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1220
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1183
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1103
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1085
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1117
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:999
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:947
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1240

References CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, DISABLE_TYPE_QUEST, Unit::GetLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestWeek(), sDisableMgr, and sWorld.

Referenced by npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverCompleteQuest().

◆ CanSeeVendor()

bool Player::CanSeeVendor ( Creature const *  creature) const
14340{
14341 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14342 return true;
14343
14344 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14345 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14346 {
14347 return false;
14348 }
14349
14350 return true;
14351}

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, and UNIT_NPC_FLAG_VENDOR.

Referenced by Unit::PatchValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1459{
1460 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1461 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1462 {
1463 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1464 if (itr != m_QuestStatus.end())
1465 {
1466 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1467 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1468 {
1470 return false;
1471 }
1472
1473 return true;
1474 }
1475 }
1476 return false;
1477}
#define sPoolMgr
Definition PoolMgr.h:163
@ QUEST_FLAGS_SHARABLE
Definition QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition QuestDef.h:74
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition PlayerQuest.cpp:2435
bool HasFlag(uint32 flag) const
Definition QuestDef.h:221

References Quest::HasFlag(), m_QuestStatus, QUEST_FLAGS_SHARABLE, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY, SendPushToPartyResponse(), sObjectMgr, and sPoolMgr.

Referenced by WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ CanSpeak()

bool Player::CanSpeak ( ) const
70{
71 return GetSession()->m_muteTime <= time (nullptr);
72}
time_t m_muteTime
Definition WorldSession.h:508

References GetSession(), and WorldSession::m_muteTime.

Referenced by WorldSession::HandleMessagechatOpcode(), and misc_commandscript::HandleUnmuteCommand().

◆ CanStoreItem() [1/2]

◆ CanStoreItem() [2/2]

InventoryResult Player::CanStoreItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
uint32  entry,
uint32  count,
Item pItem = nullptr,
bool  swap = false,
uint32 no_space_count = nullptr 
) const
1102{
1103 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, entry, count);
1104
1105 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
1106 if (!pProto)
1107 {
1108 if (no_space_count)
1109 *no_space_count = count;
1111 }
1112
1113 if (pItem)
1114 {
1115 // you bad chet0rz, wpe pro
1116 if (bag == NULL_BAG && slot == NULL_SLOT)
1117 if (pItem->IsBag() && pItem->IsNotEmptyBag())
1119
1120 // Xinef: Removed next loot generated check
1121 if (pItem->GetGUID() == GetLootGUID())
1122 {
1123 if (no_space_count)
1124 *no_space_count = count;
1126 }
1127
1128 if (pItem->IsBindedNotWith(this))
1129 {
1130 if (no_space_count)
1131 *no_space_count = count;
1133 }
1134 }
1135
1136 // check count of items (skip for auto move for same player from bank)
1137 uint32 no_similar_count = 0; // can't store this amount similar items
1138 InventoryResult res = CanTakeMoreSimilarItems(entry, count, pItem, &no_similar_count);
1139 if (res != EQUIP_ERR_OK)
1140 {
1141 if (count == no_similar_count)
1142 {
1143 if (no_space_count)
1144 *no_space_count = no_similar_count;
1145 return res;
1146 }
1147 count -= no_similar_count;
1148 }
1149
1150 // in specific slot
1151 if (bag != NULL_BAG && slot != NULL_SLOT)
1152 {
1153 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
1154 if (res != EQUIP_ERR_OK)
1155 {
1156 if (no_space_count)
1157 *no_space_count = count + no_similar_count;
1158 return res;
1159 }
1160
1161 if (count == 0)
1162 {
1163 if (no_similar_count == 0)
1164 return EQUIP_ERR_OK;
1165
1166 if (no_space_count)
1167 *no_space_count = count + no_similar_count;
1169 }
1170 }
1171
1172 // not specific slot or have space for partly store only in specific slot
1173
1174 // in specific bag
1175 if (bag != NULL_BAG)
1176 {
1177 // search stack in bag for merge to
1178 if (pProto->Stackable != 1)
1179 {
1180 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1181 {
1182 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1183 if (res != EQUIP_ERR_OK)
1184 {
1185 if (no_space_count)
1186 *no_space_count = count + no_similar_count;
1187 return res;
1188 }
1189
1190 if (count == 0)
1191 {
1192 if (no_similar_count == 0)
1193 return EQUIP_ERR_OK;
1194
1195 if (no_space_count)
1196 *no_space_count = count + no_similar_count;
1198 }
1199
1200 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1201 if (res != EQUIP_ERR_OK)
1202 {
1203 if (no_space_count)
1204 *no_space_count = count + no_similar_count;
1205 return res;
1206 }
1207
1208 if (count == 0)
1209 {
1210 if (no_similar_count == 0)
1211 return EQUIP_ERR_OK;
1212
1213 if (no_space_count)
1214 *no_space_count = count + no_similar_count;
1216 }
1217 }
1218 else // equipped bag
1219 {
1220 // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag
1221 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
1222 if (res != EQUIP_ERR_OK)
1223 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
1224
1225 if (res != EQUIP_ERR_OK)
1226 {
1227 if (no_space_count)
1228 *no_space_count = count + no_similar_count;
1229 return res;
1230 }
1231
1232 if (count == 0)
1233 {
1234 if (no_similar_count == 0)
1235 return EQUIP_ERR_OK;
1236
1237 if (no_space_count)
1238 *no_space_count = count + no_similar_count;
1240 }
1241 }
1242 }
1243
1244 // search free slot in bag for place to
1245 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1246 {
1247 // search free slot - keyring case
1248 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1249 {
1250 uint32 keyringSize = GetMaxKeyringSize();
1251 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1252 if (res != EQUIP_ERR_OK)
1253 {
1254 if (no_space_count)
1255 *no_space_count = count + no_similar_count;
1256 return res;
1257 }
1258
1259 if (count == 0)
1260 {
1261 if (no_similar_count == 0)
1262 return EQUIP_ERR_OK;
1263
1264 if (no_space_count)
1265 *no_space_count = count + no_similar_count;
1267 }
1268
1269 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1270 if (res != EQUIP_ERR_OK)
1271 {
1272 if (no_space_count)
1273 *no_space_count = count + no_similar_count;
1274 return res;
1275 }
1276
1277 if (count == 0)
1278 {
1279 if (no_similar_count == 0)
1280 return EQUIP_ERR_OK;
1281
1282 if (no_space_count)
1283 *no_space_count = count + no_similar_count;
1285 }
1286 }
1287 else if (pProto->IsCurrencyToken())
1288 {
1289 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1290 if (res != EQUIP_ERR_OK)
1291 {
1292 if (no_space_count)
1293 *no_space_count = count + no_similar_count;
1294 return res;
1295 }
1296
1297 if (count == 0)
1298 {
1299 if (no_similar_count == 0)
1300 return EQUIP_ERR_OK;
1301
1302 if (no_space_count)
1303 *no_space_count = count + no_similar_count;
1305 }
1306 }
1307
1308 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1309 if (res != EQUIP_ERR_OK)
1310 {
1311 if (no_space_count)
1312 *no_space_count = count + no_similar_count;
1313 return res;
1314 }
1315
1316 if (count == 0)
1317 {
1318 if (no_similar_count == 0)
1319 return EQUIP_ERR_OK;
1320
1321 if (no_space_count)
1322 *no_space_count = count + no_similar_count;
1324 }
1325 }
1326 else // equipped bag
1327 {
1328 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
1329 if (res != EQUIP_ERR_OK)
1330 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
1331
1332 if (res != EQUIP_ERR_OK)
1333 {
1334 if (no_space_count)
1335 *no_space_count = count + no_similar_count;
1336 return res;
1337 }
1338
1339 if (count == 0)
1340 {
1341 if (no_similar_count == 0)
1342 return EQUIP_ERR_OK;
1343
1344 if (no_space_count)
1345 *no_space_count = count + no_similar_count;
1347 }
1348 }
1349 }
1350
1351 // not specific bag or have space for partly store only in specific bag
1352
1353 // search stack for merge to
1354 if (pProto->Stackable != 1)
1355 {
1356 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1357 if (res != EQUIP_ERR_OK)
1358 {
1359 if (no_space_count)
1360 *no_space_count = count + no_similar_count;
1361 return res;
1362 }
1363
1364 if (count == 0)
1365 {
1366 if (no_similar_count == 0)
1367 return EQUIP_ERR_OK;
1368
1369 if (no_space_count)
1370 *no_space_count = count + no_similar_count;
1372 }
1373
1374 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1375 if (res != EQUIP_ERR_OK)
1376 {
1377 if (no_space_count)
1378 *no_space_count = count + no_similar_count;
1379 return res;
1380 }
1381
1382 if (count == 0)
1383 {
1384 if (no_similar_count == 0)
1385 return EQUIP_ERR_OK;
1386
1387 if (no_space_count)
1388 *no_space_count = count + no_similar_count;
1390 }
1391
1392 if (pProto->BagFamily)
1393 {
1395 {
1396 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
1397 if (res != EQUIP_ERR_OK)
1398 continue;
1399
1400 if (count == 0)
1401 {
1402 if (no_similar_count == 0)
1403 return EQUIP_ERR_OK;
1404
1405 if (no_space_count)
1406 *no_space_count = count + no_similar_count;
1408 }
1409 }
1410 }
1411
1413 {
1414 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
1415 if (res != EQUIP_ERR_OK)
1416 continue;
1417
1418 if (count == 0)
1419 {
1420 if (no_similar_count == 0)
1421 return EQUIP_ERR_OK;
1422
1423 if (no_space_count)
1424 *no_space_count = count + no_similar_count;
1426 }
1427 }
1428 }
1429
1430 // search free slot - special bag case
1431 if (pProto->BagFamily)
1432 {
1433 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1434 {
1435 uint32 keyringSize = GetMaxKeyringSize();
1436 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1437 if (res != EQUIP_ERR_OK)
1438 {
1439 if (no_space_count)
1440 *no_space_count = count + no_similar_count;
1441 return res;
1442 }
1443
1444 if (count == 0)
1445 {
1446 if (no_similar_count == 0)
1447 return EQUIP_ERR_OK;
1448
1449 if (no_space_count)
1450 *no_space_count = count + no_similar_count;
1452 }
1453 }
1454 else if (pProto->IsCurrencyToken())
1455 {
1456 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1457 if (res != EQUIP_ERR_OK)
1458 {
1459 if (no_space_count)
1460 *no_space_count = count + no_similar_count;
1461 return res;
1462 }
1463
1464 if (count == 0)
1465 {
1466 if (no_similar_count == 0)
1467 return EQUIP_ERR_OK;
1468
1469 if (no_space_count)
1470 *no_space_count = count + no_similar_count;
1472 }
1473 }
1474
1476 {
1477 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
1478 if (res != EQUIP_ERR_OK)
1479 continue;
1480
1481 if (count == 0)
1482 {
1483 if (no_similar_count == 0)
1484 return EQUIP_ERR_OK;
1485
1486 if (no_space_count)
1487 *no_space_count = count + no_similar_count;
1489 }
1490 }
1491 }
1492
1493 if (pItem && pItem->IsNotEmptyBag())
1495
1496 // search free slot
1497 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1498 if (res != EQUIP_ERR_OK)
1499 {
1500 if (no_space_count)
1501 *no_space_count = count + no_similar_count;
1502 return res;
1503 }
1504
1505 if (count == 0)
1506 {
1507 if (no_similar_count == 0)
1508 return EQUIP_ERR_OK;
1509
1510 if (no_space_count)
1511 *no_space_count = count + no_similar_count;
1513 }
1514
1516 {
1517 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
1518 if (res != EQUIP_ERR_OK)
1519 continue;
1520
1521 if (count == 0)
1522 {
1523 if (no_similar_count == 0)
1524 return EQUIP_ERR_OK;
1525
1526 if (no_space_count)
1527 *no_space_count = count + no_similar_count;
1529 }
1530 }
1531
1532 if (no_space_count)
1533 *no_space_count = count + no_similar_count;
1534
1536}
@ BAG_FAMILY_MASK_KEYS
Definition ItemTemplate.h:235
@ EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS
Definition Item.h:78
@ INVENTORY_SLOT_ITEM_START
Definition Player.h:710
@ INVENTORY_SLOT_ITEM_END
Definition Player.h:711
uint32 GetMaxKeyringSize() const
Definition Player.h:1365
bool IsCurrencyToken() const
Definition ItemTemplate.h:727

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, Object::GetGUID(), GetLootGUID(), GetMaxKeyringSize(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBag(), Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), KEYRING_SLOT_START, LOG_DEBUG, NULL_BAG, NULL_SLOT, sObjectMgr, and ItemTemplate::Stackable.

◆ CanStoreItem_InBag()

InventoryResult Player::CanStoreItem_InBag ( uint8  bag,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
bool  non_specialized,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
981{
982 // skip specific bag already processed in first called CanStoreItem_InBag
983 if (bag == skip_bag)
985
986 // skip not existed bag or self targeted bag
987 Bag* pBag = GetBagByPos(bag);
988 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())))
990
991 if (pSrcItem && pSrcItem->IsNotEmptyBag())
993
994 ItemTemplate const* pBagProto = pBag->GetTemplate();
995 if (!pBagProto)
997
998 // specialized bag mode or non-specilized
999 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1001
1002 if (!ItemCanGoIntoBag(pProto, pBagProto))
1004
1005 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1006 {
1007 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1008 if (j == skip_slot)
1009 continue;
1010
1011 Item* pItem2 = GetItemByPos(bag, j);
1012
1013 // ignore move item (this slot will be empty at move)
1014 if (pItem2 == pSrcItem)
1015 pItem2 = nullptr;
1016
1017 // if merge skip empty, if !merge skip non-empty
1018 if ((pItem2 != nullptr) != merge)
1019 continue;
1020
1021 uint32 need_space = pProto->GetMaxStackSize();
1022
1023 if (pItem2)
1024 {
1025 // can be merged at least partly
1026 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1027 if (res != EQUIP_ERR_OK)
1028 continue;
1029
1030 // descrease at current stacksize
1031 need_space -= pItem2->GetCount();
1032 }
1033
1034 if (need_space > count)
1035 need_space = count;
1036
1037 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1038 if (!newPosition.isContainedIn(dest))
1039 {
1040 dest.push_back(newPosition);
1041 count -= need_space;
1042
1043 if (count == 0)
1044 return EQUIP_ERR_OK;
1045 }
1046 }
1047 return EQUIP_ERR_OK;
1048}
@ ITEM_SUBCLASS_CONTAINER
Definition ItemTemplate.h:329
@ ITEM_CLASS_CONTAINER
Definition ItemTemplate.h:292
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition Item.cpp:176
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition Item.h:62
uint32 GetBagSize() const
Definition Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition Item.cpp:867
Definition Player.h:770
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition Player.cpp:13188

References Item::CanBeMergedPartlyWith(), ItemTemplate::Class, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Bag::GetBagSize(), Item::GetCount(), Object::GetGUID(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), ItemPosCount::isContainedIn(), Item::IsNotEmptyBag(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), and ItemTemplate::SubClass.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InInventorySlots()

InventoryResult Player::CanStoreItem_InInventorySlots ( uint8  slot_begin,
uint8  slot_end,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1051{
1052 //this is never called for non-bag slots so we can do this
1053 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1055
1056 for (uint32 j = slot_begin; j < slot_end; j++)
1057 {
1058 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1059 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1060 continue;
1061
1063
1064 // ignore move item (this slot will be empty at move)
1065 if (pItem2 == pSrcItem)
1066 pItem2 = nullptr;
1067
1068 // if merge skip empty, if !merge skip non-empty
1069 if ((pItem2 != nullptr) != merge)
1070 continue;
1071
1072 uint32 need_space = pProto->GetMaxStackSize();
1073
1074 if (pItem2)
1075 {
1076 // can be merged at least partly
1077 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1078 if (res != EQUIP_ERR_OK)
1079 continue;
1080
1081 // descrease at current stacksize
1082 need_space -= pItem2->GetCount();
1083 }
1084
1085 if (need_space > count)
1086 need_space = count;
1087
1088 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1089 if (!newPosition.isContainedIn(dest))
1090 {
1091 dest.push_back(newPosition);
1092 count -= need_space;
1093
1094 if (count == 0)
1095 return EQUIP_ERR_OK;
1096 }
1097 }
1098 return EQUIP_ERR_OK;
1099}

References Item::CanBeMergedPartlyWith(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_OK, Item::GetCount(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), and Item::IsNotEmptyBag().

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InSpecificSlot()

InventoryResult Player::CanStoreItem_InSpecificSlot ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  swap,
Item pSrcItem 
) const
private
910{
911 Item* pItem2 = GetItemByPos(bag, slot);
912
913 // ignore move item (this slot will be empty at move)
914 if (pItem2 == pSrcItem)
915 pItem2 = nullptr;
916
917 uint32 need_space;
918
919 // empty specific slot - check item fit to slot
920 if (!pItem2 || swap)
921 {
922 if (bag == INVENTORY_SLOT_BAG_0)
923 {
924 // keyring case
925 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
927
928 // currencytoken case
929 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
931
932 // prevent cheating
933 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
935 }
936 else
937 {
938 Bag* pBag = GetBagByPos(bag);
939 if (!pBag)
941
942 ItemTemplate const* pBagProto = pBag->GetTemplate();
943 if (!pBagProto)
945
946 if (slot >= pBagProto->ContainerSlots)
948
949 if (!ItemCanGoIntoBag(pProto, pBagProto))
951 }
952
953 // non empty stack with space
954 need_space = pProto->GetMaxStackSize();
955 }
956 // non empty slot, check item type
957 else
958 {
959 // can be merged at least partly
960 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
961 if (res != EQUIP_ERR_OK)
962 return res;
963
964 // free stack space or infinity
965 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
966 }
967
968 if (need_space > count)
969 need_space = count;
970
971 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
972 if (!newPosition.isContainedIn(dest))
973 {
974 dest.push_back(newPosition);
975 count -= need_space;
976 }
977 return EQUIP_ERR_OK;
978}
uint32 ContainerSlots
Definition ItemTemplate.h:646

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, BUYBACK_SLOT_END, BUYBACK_SLOT_START, Item::CanBeMergedPartlyWith(), ItemTemplate::ContainerSlots, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

InventoryResult Player::CanStoreItems ( Item **  pItem,
int32  count 
) const
1540{
1541 Item* pItem2;
1542
1543 // fill space table
1546 int inv_keys[KEYRING_SLOT_END - KEYRING_SLOT_START];
1548
1549 memset(inv_slot_items, 0, sizeof(int) * (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
1550 memset(inv_bags, 0, sizeof(int) * (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) * MAX_BAG_SIZE);
1551 memset(inv_keys, 0, sizeof(int) * (KEYRING_SLOT_END - KEYRING_SLOT_START));
1552 memset(inv_tokens, 0, sizeof(int) * (CURRENCYTOKEN_SLOT_END - CURRENCYTOKEN_SLOT_START));
1553
1555 {
1557 if (pItem2 && !pItem2->IsInTrade())
1558 inv_slot_items[i - INVENTORY_SLOT_ITEM_START] = pItem2->GetCount();
1559 }
1560
1561 for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
1562 {
1564 if (pItem2 && !pItem2->IsInTrade())
1565 inv_keys[i - KEYRING_SLOT_START] = pItem2->GetCount();
1566 }
1567
1569 {
1571 if (pItem2 && !pItem2->IsInTrade())
1572 inv_tokens[i - CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
1573 }
1574
1576 if (Bag* pBag = GetBagByPos(i))
1577 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1578 {
1579 pItem2 = GetItemByPos(i, j);
1580 if (pItem2 && !pItem2->IsInTrade())
1581 inv_bags[i - INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
1582 }
1583
1584 // check free space for all items
1585 for (int k = 0; k < count; ++k)
1586 {
1587 Item* pItem = pItems[k];
1588
1589 // no item
1590 if (!pItem)
1591 continue;
1592
1593 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems {}. item = {}, count = {}", k + 1, pItem->GetEntry(), pItem->GetCount());
1594 ItemTemplate const* pProto = pItem->GetTemplate();
1595
1596 // strange item
1597 if (!pProto)
1599
1600 // Xinef: Removed next loot generated check
1601 if (pItem->GetGUID() == GetLootGUID())
1603
1604 // item it 'bind'
1605 if (pItem->IsBindedNotWith(this))
1607
1608 ItemTemplate const* pBagProto;
1609
1610 // item is 'one item only'
1612 if (res != EQUIP_ERR_OK)
1613 return res;
1614
1615 // search stack for merge to
1616 if (pProto->Stackable != 1)
1617 {
1618 bool b_found = false;
1619
1620 for (uint8 t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; ++t)
1621 {
1623 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_keys[t - KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1624 {
1625 inv_keys[t - KEYRING_SLOT_START] += pItem->GetCount();
1626 b_found = true;
1627 break;
1628 }
1629 }
1630 if (b_found)
1631 continue;
1632
1633 for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
1634 {
1636 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_tokens[t - CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1637 {
1638 inv_tokens[t - CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
1639 b_found = true;
1640 break;
1641 }
1642 }
1643 if (b_found)
1644 continue;
1645
1647 {
1649 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_slot_items[t - INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1650 {
1651 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
1652 b_found = true;
1653 break;
1654 }
1655 }
1656 if (b_found)
1657 continue;
1658
1659 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1660 {
1661 if (Bag* bag = GetBagByPos(t))
1662 {
1663 if (ItemCanGoIntoBag(pItem->GetTemplate(), bag->GetTemplate()))
1664 {
1665 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1666 {
1667 pItem2 = GetItemByPos(t, j);
1668 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_bags[t - INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
1669 {
1670 inv_bags[t - INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
1671 b_found = true;
1672 break;
1673 }
1674 }
1675 }
1676 }
1677 }
1678 if (b_found)
1679 continue;
1680 }
1681
1682 // special bag case
1683 if (pProto->BagFamily)
1684 {
1685 bool b_found = false;
1686 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1687 {
1688 uint32 keyringSize = GetMaxKeyringSize();
1689 for (uint32 t = KEYRING_SLOT_START; t < KEYRING_SLOT_START + keyringSize; ++t)
1690 {
1691 if (inv_keys[t - KEYRING_SLOT_START] == 0)
1692 {
1693 inv_keys[t - KEYRING_SLOT_START] = 1;
1694 b_found = true;
1695 break;
1696 }
1697 }
1698 }
1699
1700 if (b_found)
1701 continue;
1702
1703 if (pProto->IsCurrencyToken())
1704 {
1706 {
1707 if (inv_tokens[t - CURRENCYTOKEN_SLOT_START] == 0)
1708 {
1709 inv_tokens[t - CURRENCYTOKEN_SLOT_START] = 1;
1710 b_found = true;
1711 break;
1712 }
1713 }
1714 }
1715
1716 if (b_found)
1717 continue;
1718
1719 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1720 {
1721 if (Bag* bag = GetBagByPos(t))
1722 {
1723 pBagProto = bag->GetTemplate();
1724
1725 // not plain container check
1726 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
1727 ItemCanGoIntoBag(pProto, pBagProto))
1728 {
1729 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1730 {
1731 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1732 {
1733 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1734 b_found = true;
1735 break;
1736 }
1737 }
1738 }
1739 }
1740 }
1741 if (b_found)
1742 continue;
1743 }
1744
1745 // search free slot
1746 bool b_found = false;
1748 {
1749 if (inv_slot_items[t - INVENTORY_SLOT_ITEM_START] == 0)
1750 {
1751 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] = 1;
1752 b_found = true;
1753 break;
1754 }
1755 }
1756 if (b_found)
1757 continue;
1758
1759 // search free slot in bags
1760 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1761 {
1762 if (Bag* bag = GetBagByPos(t))
1763 {
1764 pBagProto = bag->GetTemplate();
1765
1766 // special bag already checked
1767 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER))
1768 continue;
1769
1770 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1771 {
1772 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1773 {
1774 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1775 b_found = true;
1776 break;
1777 }
1778 }
1779 }
1780 }
1781
1782 // no free slot found?
1783 if (!b_found)
1785 }
1786
1787 return EQUIP_ERR_OK;
1788}
@ KEYRING_SLOT_END
Definition Player.h:736
bool IsInTrade() const
Definition Item.h:260

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, Item::CanBeMergedPartlyWith(), CanTakeMoreSimilarItems(), ItemTemplate::Class, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetLootGUID(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsInTrade(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), KEYRING_SLOT_END, KEYRING_SLOT_START, LOG_DEBUG, MAX_BAG_SIZE, ItemTemplate::Stackable, and ItemTemplate::SubClass.

Referenced by WorldSession::HandleAcceptTradeOpcode().

◆ CanStoreNewItem()

◆ CanTakeMoreSimilarItems() [1/3]

InventoryResult Player::CanTakeMoreSimilarItems ( Item pItem) const
inline

◆ CanTakeMoreSimilarItems() [2/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count 
) const
inline
1290{ return CanTakeMoreSimilarItems(entry, count, nullptr); }

References CanTakeMoreSimilarItems().

Referenced by CanTakeMoreSimilarItems().

◆ CanTakeMoreSimilarItems() [3/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count,
Item pItem,
uint32 no_space_count = nullptr 
) const
801{
802 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
803 if (!pProto)
804 {
805 if (no_space_count)
806 *no_space_count = count;
808 }
809
810 // no maximum
811 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
812 return EQUIP_ERR_OK;
813
814 if (pProto->MaxCount > 0)
815 {
816 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
817 if (curcount + count > uint32(pProto->MaxCount))
818 {
819 if (no_space_count)
820 *no_space_count = count + curcount - pProto->MaxCount;
822 }
823 }
824
825 // check unique-equipped limit
826 if (pProto->ItemLimitCategory)
827 {
828 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
829 if (!limitEntry)
830 {
831 if (no_space_count)
832 *no_space_count = count;
834 }
835
836 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
837 {
838 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
839 if (curcount + count > uint32(limitEntry->maxCount))
840 {
841 if (no_space_count)
842 *no_space_count = count + curcount - limitEntry->maxCount;
844 }
845 }
846 }
847
848 return EQUIP_ERR_OK;
849}
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition DBCEnums.h:379
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition Item.h:130
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition PlayerStorage.cpp:372
uint32 mode
Definition DBCStructure.h:1200

References EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_OK, GetItemCount(), GetItemCountWithLimitCategory(), ITEM_LIMIT_CATEGORY_MODE_HAVE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemTemplate::MaxCount, ItemLimitCategoryEntry::maxCount, ItemLimitCategoryEntry::mode, sItemLimitCategoryStore, and sObjectMgr.

◆ CanTakeQuest()

bool Player::CanTakeQuest ( Quest const *  quest,
bool  msg 
)
252{
253 return !sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
254 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
255 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
256 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
257 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
258 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
259 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
260 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
261 && SatisfyQuestConditions(quest, msg);
262}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition PlayerQuest.cpp:1159
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1172
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:967
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1148

References DISABLE_TYPE_QUEST, Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestConditions(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestLevel(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestStatus(), SatisfyQuestTimed(), SatisfyQuestWeek(), and sDisableMgr.

Referenced by CanCompleteQuest(), CanCompleteRepeatableQuest(), Spell::EffectQuestComplete(), Spell::EffectQuestStart(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_wg_quest_giver::OnGossipHello(), PrepareQuestMenu(), SendPreparedQuest(), and npc_costumed_orphan_matron::sGossipHello().

◆ CanTameExoticPets()

bool Player::CanTameExoticPets ( ) const
inline

◆ CanTeleport()

bool Player::CanTeleport ( )
inline
2505{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
1985{
1986 if (!sScriptMgr->CanUnequipItem(const_cast<Player*>(this), pos, swap))
1988
1989 // Applied only to equipped items and bank bags
1990 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
1991 return EQUIP_ERR_OK;
1992
1993 Item* pItem = GetItemByPos(pos);
1994
1995 // Applied only to existed equipped item
1996 if (!pItem)
1997 return EQUIP_ERR_OK;
1998
1999 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2000
2001 ItemTemplate const* pProto = pItem->GetTemplate();
2002 if (!pProto)
2004
2005 // item used
2006 if (pItem->m_lootGenerated)
2008
2009 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2010 // - combat
2011 // - in-progress arenas
2012 if (!pProto->CanChangeEquipStateInCombat())
2013 {
2014 if (IsInCombat())
2016
2017 if (Battleground* bg = GetBattleground())
2018 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2020 }
2021
2022 // Xinef: dont allow to unequip items on disarmed slot
2025
2026 if (!swap && pItem->IsNotEmptyBag())
2028
2029 return EQUIP_ERR_OK;
2030}

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanUseAttackType(), EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Item::GetSlot(), Item::GetTemplate(), IsBagPos(), IsEquipmentPos(), Unit::IsInCombat(), Item::IsNotEmptyBag(), LOG_DEBUG, Item::m_lootGenerated, sScriptMgr, and STATUS_IN_PROGRESS.

Referenced by CanEquipItem(), CanUnequipItems(), DestroyItemCount(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), and SwapItem().

◆ CanUnequipItems()

InventoryResult Player::CanUnequipItems ( uint32  item,
uint32  count 
) const
274{
275 uint32 tempcount = 0;
276
278
280 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
281 if (pItem->GetEntry() == item)
282 {
284 if (ires == EQUIP_ERR_OK)
285 {
286 tempcount += pItem->GetCount();
287 if (tempcount >= count)
288 return EQUIP_ERR_OK;
289 }
290 else
291 res = ires;
292 }
293
295 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
296 if (pItem->GetEntry() == item)
297 {
298 tempcount += pItem->GetCount();
299 if (tempcount >= count)
300 return EQUIP_ERR_OK;
301 }
302
304 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
305 if (pItem->GetEntry() == item)
306 {
307 tempcount += pItem->GetCount();
308 if (tempcount >= count)
309 return EQUIP_ERR_OK;
310 }
311
313 if (Bag* pBag = GetBagByPos(i))
314 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
315 if (Item* pItem = GetItemByPos(i, j))
316 if (pItem->GetEntry() == item)
317 {
318 tempcount += pItem->GetCount();
319 if (tempcount >= count)
320 return EQUIP_ERR_OK;
321 }
322
323 // not found req. item count and have unequippable items
324 return res;
325}
@ EQUIPMENT_SLOT_START
Definition Player.h:679

References CanUnequipItem(), CURRENCYTOKEN_SLOT_END, EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by TakeQuestSourceItem().

◆ CanUninviteFromGroup()

PartyResult Player::CanUninviteFromGroup ( ObjectGuid  targetPlayerGUID = ObjectGuid::Empty) const
Todo:
: Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
13051{
13052 Group const* grp = GetGroup();
13053 if (!grp)
13054 return ERR_NOT_IN_GROUP;
13055
13056 if (grp->isLFGGroup(true))
13057 {
13058 ObjectGuid gguid = grp->GetGUID();
13059 if (!sLFGMgr->GetKicksLeft(gguid))
13061
13062 lfg::LfgState state = sLFGMgr->GetState(gguid);
13063 if (state == lfg::LFG_STATE_BOOT)
13065
13068
13071
13072 if (grp->isRollLootActive())
13074
13076 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
13077 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
13079
13080 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
13081 {
13082 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
13083 {
13084 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
13085 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
13086 {
13088 }
13089 }
13090 }
13091
13092 /* Missing support for these types
13093 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
13094 */
13095 }
13096 else
13097 {
13098 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
13099 return ERR_NOT_LEADER;
13100
13101 if (InBattleground())
13102 return ERR_INVITE_RESTRICTED;
13103 }
13104
13105 return ERR_PARTY_RESULT_OK;
13106}
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition IWorld.h:418
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition SharedDefines.h:3732
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition SharedDefines.h:3727
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition SharedDefines.h:3723
@ ERR_NOT_LEADER
Definition SharedDefines.h:3712
@ ERR_NOT_IN_GROUP
Definition SharedDefines.h:3711
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition SharedDefines.h:3731
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition SharedDefines.h:3729
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition SharedDefines.h:3725
@ ERR_INVITE_RESTRICTED
Definition SharedDefines.h:3716
@ ERR_PARTY_RESULT_OK
Definition SharedDefines.h:3705
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition SharedDefines.h:3726
Definition GroupReference.h:27
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2261
bool IsAssistant(ObjectGuid guid) const
Definition Group.cpp:2351
bool isRollLootActive() const
Definition Group.cpp:2454
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2337
ObjectGuid GetGUID() const
Definition Group.cpp:2302
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
bool InBattleground() const
Definition Player.h:2260
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257
LfgState
Definition LFG.h:67
@ LFG_STATE_FINISHED_DUNGEON
Definition LFG.h:74
@ LFG_STATE_BOOT
Definition LFG.h:72
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition LFGMgr.h:55

References CONFIG_LFG_KICK_PREVENTION_TIMER, ERR_INVITE_RESTRICTED, ERR_NOT_IN_GROUP, ERR_NOT_LEADER, ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE, ERR_PARTY_LFG_BOOT_IN_COMBAT, ERR_PARTY_LFG_BOOT_IN_PROGRESS, ERR_PARTY_LFG_BOOT_LIMIT, ERR_PARTY_LFG_BOOT_LOOT_ROLLS, ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS, ERR_PARTY_RESULT_OK, ObjectAccessor::FindConnectedPlayer(), Group::GetFirstMember(), GetGroup(), Object::GetGUID(), Group::GetGUID(), Group::GetMembersCount(), InBattleground(), Group::IsAssistant(), Group::IsLeader(), Group::isLFGGroup(), Group::isRollLootActive(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_FINISHED_DUNGEON, sLFGMgr, and sWorld.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ CanUseAmmo()

InventoryResult Player::CanUseAmmo ( uint32  item) const
2463{
2464 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2465 if (!IsAlive())
2467 //if (isStunned())
2468 // return EQUIP_ERR_YOU_ARE_STUNNED;
2469 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2470 if (pProto)
2471 {
2472 if (pProto->InventoryType != INVTYPE_AMMO)
2474
2475 InventoryResult res = CanUseItem(pProto);
2476 if (res != EQUIP_ERR_OK)
2477 return res;
2478
2479 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2480 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2481 */
2482
2483 // Requires No Ammo
2484 if (HasAura(46699))
2485 return EQUIP_ERR_BAG_FULL6;
2486
2487 return EQUIP_ERR_OK;
2488 }
2490}
@ INVTYPE_AMMO
Definition ItemTemplate.h:280
@ EQUIP_ERR_YOU_ARE_DEAD
Definition Item.h:85
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition Item.h:54
@ EQUIP_ERR_BAG_FULL6
Definition Item.h:109

References CanUseItem(), EQUIP_ERR_BAG_FULL6, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE, EQUIP_ERR_YOU_ARE_DEAD, Unit::HasAura(), ItemTemplate::InventoryType, INVTYPE_AMMO, Unit::IsAlive(), LOG_DEBUG, and sObjectMgr.

Referenced by Create(), and SetAmmo().

◆ CanUseBattlegroundObject()

bool Player::CanUseBattlegroundObject ( GameObject gameobject) const
Bug:
sometimes when player clicks on flag in AB - client won't send gameobject_use, only gameobject_report_use packet Note: Mount, stealth and invisibility will be removed when used
13260{
13261 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13262 if (gameobject)
13263 {
13264 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13265 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13266
13267 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13268 return false;
13269 }
13270
13276 return (!isTotalImmune() && // Damage immune
13277 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13278 IsAlive()); // Alive
13279}
@ SPELL_RECENTLY_DROPPED_FLAG
Definition Battleground.h:144
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ GAMEOBJECT_FACTION
Definition UpdateFields.h:402
bool isTotalImmune() const
Definition Player.cpp:13351
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10088
Definition DBCStructure.h:938
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:950

References GAMEOBJECT_FACTION, Unit::GetFactionTemplateEntry(), Object::GetUInt32Value(), Unit::HasAura(), Unit::IsAlive(), FactionTemplateEntry::IsFriendlyTo(), isTotalImmune(), sFactionTemplateStore, and SPELL_RECENTLY_DROPPED_FLAG.

Referenced by Spell::CheckCast(), and GameObject::Use().

◆ CanUseItem() [1/2]

InventoryResult Player::CanUseItem ( Item pItem,
bool  not_loading = true 
) const
Todo:
: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY.
2220{
2221 if (pItem)
2222 {
2223 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2224
2225 if (!IsAlive() && not_loading)
2227
2228 //if (isStunned())
2229 // return EQUIP_ERR_YOU_ARE_STUNNED;
2230
2231 ItemTemplate const* pProto = pItem->GetTemplate();
2232 if (pProto)
2233 {
2234 if (pItem->IsBindedNotWith(this))
2236
2237 InventoryResult res = CanUseItem(pProto);
2238 if (res != EQUIP_ERR_OK)
2239 return res;
2240
2241 if (pItem->GetSkill() != 0)
2242 {
2243 bool allowEquip = false;
2244 uint32 itemSkill = pItem->GetSkill();
2245 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2246 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2247 {
2249
2250 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2251 // binded to account items from off server.
2252
2254 {
2255 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2256 }
2258 {
2259 allowEquip = (itemSkill == SKILL_MAIL);
2260 }
2261 }
2262 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2264 }
2265
2268
2269 return EQUIP_ERR_OK;
2270 }
2271 }
2273}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition Item.h:111
@ ITEM_QUALITY_HEIRLOOM
Definition SharedDefines.h:336
@ SKILL_PLATE_MAIL
Definition SharedDefines.h:2951
@ SKILL_MAIL
Definition SharedDefines.h:2962
uint32 GetSkill()
Definition Item.cpp:555
uint32 Quality
Definition ItemTemplate.h:626

References CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_HUNTER, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARRIOR, EQUIP_ERR_CANT_EQUIP_REPUTATION, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), IsClass(), ITEM_CLASS_ARMOR, ITEM_QUALITY_HEIRLOOM, LOG_DEBUG, ItemTemplate::Quality, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, SKILL_MAIL, and SKILL_PLATE_MAIL.

Referenced by CanBankItem(), CanEquipItem(), CanUseAmmo(), CanUseItem(), WorldSession::HandleReadItem(), and WorldSession::HandleUseItemOpcode().

◆ CanUseItem() [2/2]

InventoryResult Player::CanUseItem ( ItemTemplate const *  pItem) const
2276{
2277 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2278
2279 if (!proto)
2280 {
2282 }
2283
2284 if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE)
2285 {
2287 }
2288
2289 if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE)
2290 {
2292 }
2293
2294 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2295 {
2297 }
2298
2299 if (proto->RequiredSkill != 0)
2300 {
2301 if (GetSkillValue(proto->RequiredSkill) == 0)
2302 {
2304 }
2305 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2306 {
2308 }
2309 }
2310
2311 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2312 {
2314 }
2315
2316 if (GetLevel() < proto->RequiredLevel)
2317 {
2319 }
2320
2321 // If World Event is not active, prevent using event dependant items
2322 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2323 {
2325 }
2326
2328
2329 if (!sScriptMgr->CanUseItem(const_cast<Player*>(this), proto, result))
2330 {
2331 return result;
2332 }
2333
2334 return EQUIP_ERR_OK;
2335}
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:1933
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition Item.h:48
HolidayIds
Definition SharedDefines.h:2741

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), ItemTemplate::HasFlag2(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::RequiredLevel, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

◆ CastItemCombatSpell() [1/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx 
)
7236{
7237 if (!target || !target->IsAlive() || target == this)
7238 return;
7239
7240 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7241 // Xinef: normal forms proc on hit enchants / built in item bonuses
7243 return;
7244
7246 {
7247 // If usable, try to cast item spell
7248 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7249 if (!item->IsBroken())
7250 if (ItemTemplate const* proto = item->GetTemplate())
7251 {
7252 // Additional check for weapons
7253 if (proto->Class == ITEM_CLASS_WEAPON)
7254 {
7255 // offhand item cannot proc from main hand hit etc
7256 EquipmentSlots slot;
7257 switch (attType)
7258 {
7259 case BASE_ATTACK:
7261 break;
7262 case OFF_ATTACK:
7264 break;
7265 case RANGED_ATTACK:
7266 slot = EQUIPMENT_SLOT_RANGED;
7267 break;
7268 default:
7269 slot = EQUIPMENT_SLOT_END;
7270 break;
7271 }
7272 if (slot != i)
7273 continue;
7274 }
7275
7276 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7277 }
7278 }
7279}
EquipmentSlots
Definition Player.h:678
@ FORM_GHOSTWOLF
Definition UnitDefines.h:85
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7235

References BASE_ATTACK, Unit::CanUseAttackType(), CastItemCombatSpell(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, FORM_GHOSTWOLF, GetItemByPos(), Unit::GetShapeshiftForm(), INVENTORY_SLOT_BAG_0, Unit::IsAlive(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by CastItemCombatSpell(), Unit::DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ CastItemCombatSpell() [2/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx,
Item item,
ItemTemplate const *  proto 
)
7282{
7283 if (!sScriptMgr->CanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7284 return;
7285
7286 // Can do effect if any damage done to target
7287 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7288 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7289 {
7290 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7291 {
7292 _Spell const& spellData = proto->Spells[i];
7293
7294 // no spell
7295 if (!spellData.SpellId)
7296 continue;
7297
7298 // wrong triggering type
7300 continue;
7301
7302 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7303 if (!spellInfo)
7304 {
7305 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7306 continue;
7307 }
7308
7309 float chance = (float)spellInfo->ProcChance;
7310
7311 if (spellData.SpellPPMRate)
7312 {
7313 uint32 WeaponSpeed = GetAttackTime(attType);
7314 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7315 }
7316 else if (chance > 100.0f)
7317 {
7318 chance = GetWeaponProcChance();
7319 }
7320
7321 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7323 }
7324 }
7325
7326 // item combat enchantments
7327 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7328 {
7329 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7330 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7331 if (!pEnchant)
7332 continue;
7333
7334 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7335 {
7336 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7337 continue;
7338
7339 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7340
7341 if (entry && entry->procEx)
7342 {
7343 // Check hit/crit/dodge/parry requirement
7344 if ((entry->procEx & procEx) == 0)
7345 continue;
7346 }
7347 else
7348 {
7349 // Can do effect if any damage done to target
7350 if (!(procVictim & PROC_FLAG_TAKEN_DAMAGE))
7351 //if (!(damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE))
7352 continue;
7353 }
7354
7355 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_WHITE_HIT) && (procVictim & SPELL_PROC_FLAG_MASK))
7356 continue;
7357
7358 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7359 if (!spellInfo)
7360 {
7361 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7362 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7363 continue;
7364 }
7365
7366 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
7367 {
7368 Unit* checkTarget = spellInfo->IsPositive() ? this : target;
7369 if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
7370 {
7371 continue;
7372 }
7373 }
7374
7375 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7376
7377 if (entry)
7378 {
7379 if (entry->PPMChance)
7380 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7381 else if (entry->customChance)
7382 chance = (float)entry->customChance;
7383 }
7384
7385 // Apply spell mods
7386 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7387
7388 // Shiv has 100% chance to apply the poison
7389 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7390 chance = 100.0f;
7391
7392 if (roll_chance_f(chance))
7393 {
7394 // Xinef: implement enchant charges
7395 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7396 {
7397 if (!--charges)
7398 {
7399 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7400 item->ClearEnchantment(EnchantmentSlot(e_slot));
7401 }
7402 else
7403 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7404 }
7405
7406 Unit* unitTarget = spellInfo->IsPositive() ? this : target;
7408 }
7409 }
7410 }
7411}
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition ItemTemplate.h:79
bool roll_chance_f(float chance)
Definition Random.h:53
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition SpellDefines.h:135
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ SPELL_PROC_FLAG_MASK
Definition SpellMgr.h:156
@ ENCHANT_PROC_ATTR_WHITE_HIT
Definition SpellMgr.h:310
@ ENCHANT_PROC_ATTR_EXCLUSIVE
Definition SpellMgr.h:309
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition Item.cpp:951
void ClearEnchantment(EnchantmentSlot slot)
Definition Item.cpp:960
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition Item.h:306
bool IsPositive() const
Definition SpellInfo.cpp:1237
uint32 ProcChance
Definition SpellInfo.h:356
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13510
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4177
float GetWeaponProcChance() const
Definition Unit.cpp:13499
Definition SpellMgr.h:314
uint32 procEx
Definition SpellMgr.h:317
uint32 attributeMask
Definition SpellMgr.h:318
uint32 customChance
Definition SpellMgr.h:315
float PPMChance
Definition SpellMgr.h:316
uint32 ID
Definition DBCStructure.h:1841
float SpellPPMRate
Definition ItemTemplate.h:594

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), SpellEnchantProcEntry::attributeMask, Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, ENCHANT_PROC_ATTR_EXCLUSIVE, ENCHANT_PROC_ATTR_WHITE_HIT, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), Unit::HasAura(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, SpellInfo::IsPositive(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_SPELLTRIGGER_CHANCE_ON_HIT, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, SpellEnchantProcEntry::PPMChance, PROC_FLAG_TAKEN_DAMAGE, SpellInfo::ProcChance, SpellEnchantProcEntry::procEx, roll_chance_f(), Item::SetEnchantmentCharges(), SPELL_PROC_FLAG_MASK, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, SPELLMOD_CHANCE_OF_SUCCESS, _Spell::SpellPPMRate, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Position::ToString(), TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD, and SpellItemEnchantmentEntry::type.

◆ CastItemUseSpell()

void Player::CastItemUseSpell ( Item item,
SpellCastTargets const &  targets,
uint8  cast_count,
uint32  glyphIndex 
)
7414{
7415 if (!sScriptMgr->CanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7416 return;
7417
7418 ItemTemplate const* proto = item->GetTemplate();
7419 // special learning case
7420 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7421 {
7422 uint32 learn_spell_id = proto->Spells[0].SpellId;
7423 uint32 learning_spell_id = proto->Spells[1].SpellId;
7424
7425 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7426 if (!spellInfo)
7427 {
7428 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7429 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7430 return;
7431 }
7432
7433 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7434 spell->m_CastItem = item;
7435 spell->m_cast_count = cast_count; //set count of casts
7436 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7437 spell->prepare(&targets);
7438 return;
7439 }
7440
7441 // use triggered flag only for items with many spell casts and for not first cast
7442 uint8 count = 0;
7443
7444 std::list<Spell*> pushSpells;
7445 // item spells casted at use
7446 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7447 {
7448 _Spell const& spellData = proto->Spells[i];
7449
7450 // no spell
7451 if (!spellData.SpellId)
7452 continue;
7453
7454 // wrong triggering type
7455 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7456 continue;
7457
7458 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7459 if (!spellInfo)
7460 {
7461 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7462 continue;
7463 }
7464
7465 if (HasSpellCooldown(spellInfo->Id))
7466 {
7467 continue;
7468 }
7469
7470 if (!spellInfo->CheckElixirStacking(this))
7471 {
7472 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7473 continue;
7474 }
7475
7476 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7477 spell->m_CastItem = item;
7478 spell->m_cast_count = cast_count; // set count of casts
7479 spell->m_glyphIndex = glyphIndex; // glyph index
7480 spell->InitExplicitTargets(targets);
7481
7482 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7483 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7484 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7485 SpellCastResult result = spell->CheckCast(true);
7486 if (result != SPELL_CAST_OK)
7487 {
7488 spell->SendCastResult(result);
7489 delete spell;
7490 continue;
7491 }
7492
7493 pushSpells.push_back(spell);
7494 //spell->prepare(&targets);
7495
7496 ++count;
7497 }
7498
7499 // Item enchantments spells casted at use
7500 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7501 {
7502 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7503 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7504 if (!pEnchant)
7505 continue;
7506 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7507 {
7508 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7509 continue;
7510
7511 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7512 if (!spellInfo)
7513 {
7514 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7515 continue;
7516 }
7517
7518 if (HasSpellCooldown(spellInfo->Id))
7519 continue;
7520
7521 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7522 spell->m_CastItem = item;
7523 spell->m_cast_count = cast_count; // set count of casts
7524 spell->m_glyphIndex = glyphIndex; // glyph index
7525 spell->InitExplicitTargets(targets);
7526
7527 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7528 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7529 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7530 SpellCastResult result = spell->CheckCast(true);
7531 if (result != SPELL_CAST_OK)
7532 {
7533 spell->SendCastResult(result);
7534 delete spell;
7535 continue;
7536 }
7537
7538 pushSpells.push_back(spell);
7539 //spell->prepare(&targets);
7540
7541 ++count;
7542 }
7543 }
7544
7545 // xinef: send all spells in one go, prevents crash because container is not set
7546 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7547 (*itr)->prepare(&targets);
7548}
@ EQUIP_ERR_NONE
Definition Item.h:106
SpellCastResult
Definition SharedDefines.h:948
@ SPELL_FAILED_AURA_BOUNCED
Definition SharedDefines.h:958
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113
@ TRIGGERED_NONE
Definition SpellDefines.h:133
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16369
bool CheckElixirStacking(Unit const *caster) const
Definition SpellInfo.cpp:2888
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3480
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8443
uint8 m_cast_count
Definition Spell.h:527
uint32 m_glyphIndex
Definition Spell.h:528
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5664
void InitExplicitTargets(SpellCastTargets const &targets)
Definition Spell.cpp:717
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4680
Item * m_CastItem
Definition Spell.h:524

References Spell::CheckCast(), SpellInfo::CheckElixirStacking(), EQUIP_ERR_NONE, Item::GetEnchantmentId(), Item::GetTemplate(), HasSpellCooldown(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, Spell::InitExplicitTargets(), ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, LOG_ERROR, Spell::m_cast_count, Spell::m_CastItem, Spell::m_glyphIndex, MAX_ENCHANTMENT_SLOT, MAX_ITEM_PROTO_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, Spell::prepare(), Spell::SendCastResult(), SendEquipError(), Spell::SetSpellValue(), SPELL_CAST_OK, SPELL_FAILED_AURA_BOUNCED, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, ItemTemplate::Spells, _Spell::SpellTrigger, SPELLVALUE_BASE_POINT0, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TRIGGERED_FULL_MASK, TRIGGERED_NONE, and SpellItemEnchantmentEntry::type.

Referenced by WorldSession::HandleUseItemOpcode().

◆ CharmSpellInitialize()

void Player::CharmSpellInitialize ( )
9681{
9682 Unit* charm = GetFirstControlled();
9683 if (!charm)
9684 return;
9685
9686 CharmInfo* charmInfo = charm->GetCharmInfo();
9687 if (!charmInfo)
9688 {
9689 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9690 return;
9691 }
9692
9693 uint8 addlist = 0;
9694 if (!charm->IsPlayer())
9695 {
9696 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9697 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9698 {
9699 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9700 if (charmInfo->GetCharmSpell(i)->GetAction())
9701 ++addlist;
9702 }
9703 }
9704
9705 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9706 data << charm->GetGUID();
9707 data << uint16(0);
9708 data << uint32(0);
9709
9710 if (!charm->IsPlayer())
9711 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9712 else
9713 data << uint32(0);
9714
9715 charmInfo->BuildActionBar(&data);
9716
9717 data << uint8(addlist);
9718
9719 if (addlist)
9720 {
9721 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9722 {
9723 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9724 if (cspell->GetAction())
9725 data << uint32(cspell->packedData);
9726 }
9727 }
9728
9729 data << uint8(0); // cooldowns count
9730
9731 GetSession()->SendPacket(&data);
9732}
#define MAX_SPELL_CHARM
Definition CharmInfo.h:24
#define MAX_UNIT_ACTION_BAR_INDEX
Definition CharmInfo.h:29
ReactStates GetReactState() const
Definition Creature.h:95
CharmInfo * GetCharmInfo()
Definition Unit.h:1215
Unit * GetFirstControlled() const
Definition Unit.cpp:11134
@ SMSG_PET_SPELLS
Definition Opcodes.h:407
Definition CharmInfo.h:127
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition CharmInfo.h:158
CommandStates GetCommandState() const
Definition CharmInfo.h:136
void BuildActionBar(WorldPacket *data)
Definition CharmInfo.cpp:285
Definition CharmInfo.h:95
uint32 packedData
Definition CharmInfo.h:98
uint32 GetAction() const
Definition CharmInfo.h:102

References CharmInfo::BuildActionBar(), UnitActionBarEntry::GetAction(), Unit::GetCharmInfo(), CharmInfo::GetCharmSpell(), CharmInfo::GetCommandState(), Unit::GetFirstControlled(), Object::GetGUID(), Creature::GetReactState(), GetSession(), Object::IsPlayer(), LOG_ERROR, MAX_SPELL_CHARM, MAX_UNIT_ACTION_BAR_INDEX, UnitActionBarEntry::packedData, WorldSession::SendPacket(), SMSG_PET_SPELLS, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by spell_mage_summon_water_elemental::HandleDummy(), WorldSession::HandleRequestPetInfo(), Unit::SetCharmedBy(), and Unit::SetMinion().

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13942{
13944}
void CheckAllAchievementCriteria()
Definition AchievementMgr.cpp:800

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

Referenced by Create(), and WorldSession::HandlePlayerLoginFromDB().

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7692{
7693 if (!ammo_proto)
7694 return false;
7695
7696 // check ranged weapon
7698 if (!weapon || weapon->IsBroken())
7699 return false;
7700
7701 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7702 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7703 return false;
7704
7705 // check ammo ws. weapon compatibility
7706 switch (weapon_proto->SubClass)
7707 {
7710 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7711 return false;
7712 break;
7714 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7715 return false;
7716 break;
7717 default:
7718 return false;
7719 }
7720
7721 return true;
7722}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition ItemTemplate.h:362
@ ITEM_SUBCLASS_WEAPON_GUN
Definition ItemTemplate.h:347
@ ITEM_SUBCLASS_WEAPON_BOW
Definition ItemTemplate.h:346
@ ITEM_SUBCLASS_ARROW
Definition ItemTemplate.h:416
@ ITEM_SUBCLASS_BULLET
Definition ItemTemplate.h:417
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:488

References ItemTemplate::Class, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), ITEM_CLASS_WEAPON, ITEM_SUBCLASS_ARROW, ITEM_SUBCLASS_BULLET, ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_CROSSBOW, ITEM_SUBCLASS_WEAPON_GUN, RANGED_ATTACK, and ItemTemplate::SubClass.

Referenced by _ApplyAmmoBonuses().

◆ CheckAreaExploreAndOutdoor()

void Player::CheckAreaExploreAndOutdoor ( )
5750{
5751 if (!IsAlive())
5752 return;
5753
5754 if (IsInFlight())
5755 return;
5756
5757 bool isOutdoor = IsOutdoors();
5758 uint32 areaId = GetAreaId();
5759 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5760
5761 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5762 {
5763 _wasOutdoor = isOutdoor;
5764
5766 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5767 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5768 {
5769 Aura* aura = iter->second->GetBase();
5770 SpellInfo const* spell = aura->GetSpellInfo();
5771 if (spell->Attributes & attrToRemove)
5772 {
5773 // if passive - do not remove and just turn off all effects
5774 if (aura->IsPassive())
5775 {
5776 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5777 ++iter;
5778 continue;
5779 }
5780
5781 RemoveAura(iter);
5782 }
5783 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5784 {
5785 // if passive - turn on all effects
5786 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5787 ++iter;
5788 }
5789 else
5790 {
5791 ++iter;
5792 }
5793 }
5794 }
5795
5796 if (!sScriptMgr->CanAreaExploreAndOutdoor(this))
5797 return;
5798
5799 if (!areaId)
5800 return;
5801
5802 if (!areaEntry)
5803 {
5804 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5806 return;
5807 }
5808
5809 uint32 offset = areaEntry->exploreFlag / 32;
5810
5811 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5812 {
5813 LOG_ERROR("entities.player", "Wrong area flag {} in map data for (X: {} Y: {}) point to field PLAYER_EXPLORED_ZONES_1 + {} ( {} must be < {} ).", areaEntry->flags, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE);
5814 return;
5815 }
5816
5817 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5818 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5819
5820 if (!(currFields & val))
5821 {
5822 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5823
5825
5826 if (areaEntry->area_level > 0)
5827 {
5828 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5829 {
5830 SendExplorationExperience(areaId, 0);
5831 }
5832 else
5833 {
5834 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5835 uint32 XP = 0;
5836 if (diff < -5)
5837 {
5838 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5839 }
5840 else if (diff > 5)
5841 {
5842 int32 exploration_percent = (100 - ((diff - 5) * 5));
5843 if (exploration_percent > 100)
5844 exploration_percent = 100;
5845 else if (exploration_percent < 0)
5846 exploration_percent = 0;
5847
5848 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5849 }
5850 else
5851 {
5852 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5853 }
5854
5855 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE);
5856 GiveXP(XP, nullptr);
5857 SendExplorationExperience(areaId, XP);
5858 }
5859 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5860 }
5861 }
5862}
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition DBCEnums.h:157
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ CONFIG_MAX_PLAYER_LEVEL
Definition IWorld.h:236
@ CONFIG_VMAP_INDOOR_CHECK
Definition IWorld.h:123
@ RATE_XP_EXPLORE
Definition IWorld.h:478
@ XPSOURCE_EXPLORE
Definition Player.h:1017
@ SPELL_ATTR0_ONLY_INDOORS
Definition SharedDefines.h:396
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition SharedDefines.h:397
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuras.cpp:1241
bool IsPassive() const
Definition SpellAuras.cpp:1082
void SendExplorationExperience(uint32 Area, uint32 Experience)
Definition PlayerMisc.cpp:159
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition Player.cpp:2395
uint32 Attributes
Definition SpellInfo.h:324
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4809
bool IsInFlight() const
Definition Unit.h:1625
AuraApplicationMap m_appliedAuras
Definition Unit.h:2081
bool IsOutdoors() const
Definition Object.cpp:3184
Definition DBCStructure.h:518
int32 area_level
Definition DBCStructure.h:525
uint32 flags
Definition DBCStructure.h:523
uint32 exploreFlag
Definition DBCStructure.h:522

References _wasOutdoor, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, AreaTableEntry::area_level, SpellInfo::Attributes, AURA_EFFECT_HANDLE_REAL, CONFIG_MAX_PLAYER_LEVEL, CONFIG_VMAP_INDOOR_CHECK, AreaTableEntry::exploreFlag, AreaTableEntry::flags, WorldObject::GetAreaId(), Object::GetGUID(), Unit::GetLevel(), WorldLocation::GetMapId(), WorldObject::GetName(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Aura::GetSpellInfo(), Object::GetUInt32Value(), GiveXP(), Aura::HandleAllEffects(), Unit::IsAlive(), Unit::IsInFlight(), WorldObject::IsOutdoors(), Aura::IsPassive(), LOG_DEBUG, LOG_ERROR, Unit::m_appliedAuras, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, RATE_XP_EXPLORE, Unit::RemoveAura(), sAreaTableStore, SendExplorationExperience(), Unit::SetUInt32Value(), sObjectMgr, SPELL_ATTR0_ONLY_INDOORS, SPELL_ATTR0_ONLY_OUTDOORS, sScriptMgr, sWorld, Position::ToString(), UpdateAchievementCriteria(), and XPSOURCE_EXPLORE.

Referenced by UpdatePosition().

◆ CheckDuelDistance()

void Player::CheckDuelDistance ( time_t  currTime)
6404{
6405 if (!duel)
6406 {
6407 return;
6408 }
6409
6411 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6412 if (!obj)
6413 return;
6414
6415 if (!duel->OutOfBoundsTime)
6416 {
6417 if (!IsWithinDistInMap(obj, 50))
6418 {
6419 duel->OutOfBoundsTime = currTime + 10;
6420
6422 GetSession()->SendPacket(&data);
6423 }
6424 }
6425 else
6426 {
6427 if (IsWithinDistInMap(obj, 40))
6428 {
6429 duel->OutOfBoundsTime = 0;
6430
6432 GetSession()->SendPacket(&data);
6433 }
6434 else if (currTime >= duel->OutOfBoundsTime)
6436 }
6437}
@ DUEL_FLED
Definition SharedDefines.h:3614
@ PLAYER_DUEL_ARBITER
Definition UpdateFields.h:177
Definition GameObject.h:120
GameObject * GetGameObject(ObjectGuid const guid)
Definition Map.cpp:3333
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6444
std::unique_ptr< DuelInfo > duel
Definition Player.h:1885
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1332
@ SMSG_DUEL_INBOUNDS
Definition Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition Opcodes.h:390

References duel, DUEL_FLED, DuelComplete(), Map::GetGameObject(), Object::GetGuidValue(), WorldObject::GetMap(), GetSession(), WorldObject::IsWithinDistInMap(), PLAYER_DUEL_ARBITER, WorldSession::SendPacket(), SMSG_DUEL_INBOUNDS, and SMSG_DUEL_OUTOFBOUNDS.

Referenced by Update().

◆ CheckInstanceCount()

bool Player::CheckInstanceCount ( uint32  instanceId) const
6982{
6983 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6984 return true;
6985 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
6986}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition IWorld.h:364

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

bool Player::CheckInstanceLoginValid ( )
6953{
6954 if (!GetMap())
6955 return false;
6956
6957 if (!GetMap()->IsDungeon() || IsGameMaster())
6958 return true;
6959
6960 if (GetMap()->IsRaid())
6961 {
6962 // cannot be in raid instance without a group
6963 if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
6964 return false;
6965 }
6966 else
6967 {
6968 // cannot be in normal instance without a group and more players than 1 in instance
6969 if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1)
6970 return false;
6971 }
6972
6973 // pussywizard: check CanEnter for GetMap(), because in PlayerCannotEnter it is called for a map decided before loading screen (can change)
6974 if (GetMap()->CannotEnter(this, true))
6975 return false;
6976
6977 // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
6978 return sMapMgr->PlayerCannotEnter(GetMap()->GetId(), this, true) == Map::CAN_ENTER;
6979}
@ CONFIG_INSTANCE_IGNORE_RAID
Definition IWorld.h:85
#define sMapMgr
Definition MapMgr.h:219
@ CAN_ENTER
Definition Map.h:422
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:229

References Map::CAN_ENTER, CONFIG_INSTANCE_IGNORE_RAID, GetGroup(), WorldObject::GetMap(), IsGameMaster(), sMapMgr, and sWorld.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10468{
10469 // For spells that trigger flying paths remove them at arrival
10471 {
10474 }
10475 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10476 Dismount();
10479}
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:270
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
void Dismount()
Definition Unit.cpp:13583
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:916

References PlayerTaxi::ClearTaxiDestinations(), Unit::Dismount(), Unit::getHostileRefMgr(), m_flightSpellActivated, m_taxi, Unit::RemoveAurasDueToSpell(), Unit::RemoveUnitFlag(), HostileRefMgr::setOnlineOfflineState(), UNIT_FLAG_DISABLE_MOVE, and UNIT_FLAG_TAXI_FLIGHT.

Referenced by go_commandscript::DoTeleport(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), and TeleportTo().

◆ CleanupChannels()

void Player::CleanupChannels ( )
5024{
5025 while (!m_channels.empty())
5026 {
5027 Channel* ch = *m_channels.begin();
5028 m_channels.erase(m_channels.begin()); // remove from player's channel list
5029 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
5030 }
5031}
Definition Channel.h:144
void LeaveChannel(Player *player, bool send=true)
Definition Channel.cpp:249
JoinedChannelsList m_channels
Definition Player.h:2857

References Channel::LeaveChannel(), and m_channels.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), and WorldSession::LogoutPlayer().

◆ CleanupsBeforeDelete()

void Player::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

462{
463 TradeCancel(false);
465
466 Unit::CleanupsBeforeDelete(finalCleanup);
467}
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3612
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Unit.cpp:15837

References Unit::CleanupsBeforeDelete(), DUEL_INTERRUPTED, DuelComplete(), and TradeCancel().

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

void Player::ClearAfkReports ( )
inline
2292{ m_bgData.bgAfkReporter.clear(); }
GuidSet bgAfkReporter
Definition Player.h:1047

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
5034{
5035 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
5036 (*itr)->RemoveWatching(this);
5037}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1833{ setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
Definition Player.h:1823

References ObjectGuid::Empty, and setResurrectRequestData().

Referenced by WorldSession::HandleResurrectResponseOpcode(), Player(), and setDeathState().

◆ ClearWhisperWhiteList()

void Player::ClearWhisperWhiteList ( )
inline
2566{ WhisperList.clear(); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13977{
13979}
void CompletedAchievement(AchievementEntry const *entry)
Definition AchievementMgr.cpp:2270

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand().

◆ CompleteQuest()

void Player::CompleteQuest ( uint32  quest_id)
599{
600 if (!quest_id)
601 {
602 return;
603 }
604
605 if (!sScriptMgr->OnBeforePlayerQuestComplete(this, quest_id))
606 {
607 return;
608 }
609
611
612 auto log_slot = FindQuestSlot(quest_id);
613 if (log_slot < MAX_QUEST_LOG_SIZE)
614 {
616 }
617
618 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
619 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING))
620 {
621 RewardQuest(qInfo, 0, this, false);
622 }
623
624 // Xinef: area auras may change on quest completion!
628
629 // check if Quest Tracker is enabled
630 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
631 {
632 // prepare Quest Tracker datas
633 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
634 stmt->SetData(0, quest_id);
635 stmt->SetData(1, GetGUID().GetCounter());
636
637 // add to Quest Tracker
638 CharacterDatabase.Execute(stmt);
639 }
640}
@ CHAR_UPD_QUEST_TRACK_COMPLETE_TIME
Definition CharacterDatabase.h:503
@ ADDITIONAL_SAVING_INVENTORY_AND_GOLD
Definition Player.h:997
@ QUEST_FLAGS_TRACKING
Definition QuestDef.h:142
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:659
void SetQuestStatus(uint32 questId, QuestStatus status, bool update=true)
Definition PlayerQuest.cpp:1479

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, FindQuestSlot(), WorldObject::GetAreaId(), Object::GetGUID(), WorldObject::GetZoneId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_TRACKING, QUEST_STATE_COMPLETE, QUEST_STATUS_COMPLETE, RewardQuest(), SetQuestSlotState(), SetQuestStatus(), sObjectMgr, sScriptMgr, sWorld, UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_plucky::OnGossipSelect(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), TalkedToCreature(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ ContinueTaxiFlight()

void Player::ContinueTaxiFlight ( )
10482{
10483 uint32 sourceNode = m_taxi.GetTaxiSource();
10484 if (!sourceNode)
10485 return;
10486
10487 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10488
10489 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10490 if (!mountDisplayId)
10491 return;
10492
10494
10495 // search appropriate start path node
10496 uint32 startNode = 0;
10497
10498 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10499
10500 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10501 float currDist = 0.0f;
10502
10503 // xinef: changed to -1, we dont want to catch last node
10504 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10505 {
10506 TaxiPathNodeEntry const* node = nodeList[i];
10507 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10508
10509 // xinef: skip nodes at another map, get last valid node on current map
10510 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10511 continue;
10512
10513 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10514 if (currDist < bestDist)
10515 {
10516 startNode = i;
10517 bestDist = currDist;
10518 }
10519 }
10520
10521 // xinef: no proper node was found
10522 if (startNode == 0)
10523 {
10525 return;
10526 }
10527
10529 {
10531 }
10532
10533 if (IsMounted())
10534 {
10536 }
10537
10538 SetCanTeleport(true);
10539
10540 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10541}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition DBCStructure.h:2244
#define SIZE_OF_GRIDS
Definition MapDefines.h:25
uint32 GetTaxiSource() const
Definition PlayerTaxi.h:63
uint32 GetCurrentTaxiPath() const
Definition PlayerTaxi.cpp:213
void SetCanTeleport(bool value)
Definition Player.h:2506
Definition DBCStructure.h:1972
float y
Definition DBCStructure.h:1978
float x
Definition DBCStructure.h:1977
uint32 mapid
Definition DBCStructure.h:1976
float z
Definition DBCStructure.h:1979

References PlayerTaxi::ClearTaxiDestinations(), PlayerTaxi::GetCurrentTaxiPath(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), LOG_DEBUG, m_taxi, TaxiPathNodeEntry::mapid, Unit::RemoveAurasByType(), WorldSession::SendDoFlight(), SetCanTeleport(), SIZE_OF_GRIDS, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiPathNodesByPath, Position::ToString(), TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

Referenced by WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), and ProcessDelayedOperations().

◆ ConvertRune()

void Player::ConvertRune ( uint8  index,
RuneType  newType 
)
13458{
13459 SetCurrentRune(index, newType);
13460
13462 data << uint8(index);
13463 data << uint8(newType);
13464 GetSession()->SendPacket(&data);
13465}
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition Player.h:2523
@ SMSG_CONVERT_RUNE
Definition Opcodes.h:1188

References GetSession(), WorldSession::SendPacket(), SetCurrentRune(), and SMSG_CONVERT_RUNE.

Referenced by AddRuneByAuraEffect(), RemoveRunesByAuraEffect(), and RestoreBaseRune().

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11247{
11248 //cycle all equipped items
11249 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11250 {
11251 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11252 if (slot == exceptslot)
11253 continue;
11254
11255 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11256
11257 if (!pItem || !pItem->HasSocket())
11258 continue;
11259
11260 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11261 {
11262 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11263 if (!enchant_id)
11264 continue;
11265
11266 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11267 if (!enchantEntry)
11268 continue;
11269
11270 uint32 condition = enchantEntry->EnchantmentCondition;
11271 if (condition)
11272 {
11273 //was enchant active with/without item?
11274 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11275 //should it now be?
11276 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11277 {
11278 // ignore item gem conditions
11279 //if state changed, (dis)apply enchant
11280 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11281 }
11282 }
11283 }
11284 }
11285}

References ApplyEnchantment(), SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by _ApplyItemMods().

◆ Create()

bool Player::Create ( ObjectGuid::LowType  guidlow,
CharacterCreateInfo createInfo 
)
Todo:
: need more checks against packet modifications
470{
471 // FIXME: outfitId not used in player creating
473 // should check that skin, face, hair* are valid via DBC per race/class
474 // also do it in Player::BuildEnumData, Player::LoadFromDB
475
477
478 m_name = createInfo->Name;
479
480 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
481 if (!info)
482 {
483 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid race/class pair ({}/{}) - refusing to do so.",
484 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
485 return false;
486 }
487
488 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
489 m_items[i] = nullptr;
490
491 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
492
493 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
494 if (!cEntry)
495 {
496 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid character class ({}) - refusing to do so (wrong DBC-files?)",
497 GetSession()->GetAccountId(), m_name, createInfo->Class);
498 return false;
499 }
500
501 SetMap(sMapMgr->CreateMap(info->mapId, this));
502
503 uint8 powertype = cEntry->powerType;
504
505 SetObjectScale(1.0f);
506
507 m_realRace = createInfo->Race; // set real race flag
508 m_race = createInfo->Race; // set real race flag
509
510 SetFactionForRace(createInfo->Race);
511
512 if (!IsValidGender(createInfo->Gender))
513 {
514 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
515 GetSession()->GetAccountId(), m_name, createInfo->Gender);
516 return false;
517 }
518
519 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
520
521 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
523 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
524 {
527 }
529 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
530 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
531
532 // -1 is default value
534
535 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
537 (0x00 << 8) |
538 (0x00 << 16) |
539 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
540 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
541 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
542
546
547 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
548 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
550
555
556 // set starting level
558 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
560
562 {
563 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
564 if (gm_level > start_level)
565 start_level = gm_level;
566 }
567
568 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
569
570 InitRunes();
571
573 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
577
578 // Played time
582
583 // base stats and related field values
588 InitPrimaryProfessions(); // to max set before any spell added
589
590 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
592 {
593 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
595 }
596
598 {
603 }
604
605 // original spells
608
609 // original action bar
610 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
611 addActionButton(action_itr->button, action_itr->action, action_itr->type);
612
613 // original items
614 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
615 {
616 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
617 {
618 if (oEntry->ItemId[j] <= 0)
619 continue;
620
621 uint32 itemId = oEntry->ItemId[j];
622
623 // just skip, reported in ObjectMgr::LoadItemTemplates
624 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
625 if (!iProto)
626 continue;
627
628 // BuyCount by default
629 uint32 count = iProto->BuyCount;
630
631 // special amount for food/drink
632 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
633 {
634 switch (iProto->Spells[0].SpellCategory)
635 {
636 case SPELL_CATEGORY_FOOD: // food
638 break;
639 case SPELL_CATEGORY_DRINK: // drink
640 count = 2;
641 break;
642 }
643 if (iProto->GetMaxStackSize() < count)
644 count = iProto->GetMaxStackSize();
645 }
646 StoreNewItemInBestSlots(itemId, count);
647 }
648 }
649
650 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
651 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
652
653 // bags and main-hand weapon must equipped at this moment
654 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
655 // or ammo not equipped in special bag
657 {
658 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
659 {
660 uint16 eDest;
661 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
662 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
663 if (msg == EQUIP_ERR_OK)
664 {
666 EquipItem(eDest, pItem, true);
667 }
668 // move other items to more appropriate slots (ammo not equipped in special bag)
669 else
670 {
671 ItemPosCountVec sDest;
672 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
673 if (msg == EQUIP_ERR_OK)
674 {
676 pItem = StoreItem(sDest, pItem, true);
677 }
678
679 // if this is ammo then use it
680 msg = CanUseAmmo(pItem->GetEntry());
681 if (msg == EQUIP_ERR_OK)
682 SetAmmo(pItem->GetEntry());
683 }
684 }
685 }
686 // all item positions resolved
687
688 // ensure player starts with full health
691
693
694 return true;
695}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition DBCStores.cpp:842
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
#define MAX_OUTFIT_ITEMS
Definition DBCStructure.h:616
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition IWorld.h:241
@ CONFIG_GAME_TYPE
Definition IWorld.h:218
@ CONFIG_START_GM_LEVEL
Definition IWorld.h:261
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition IWorld.h:239
@ CONFIG_START_ARENA_POINTS
Definition IWorld.h:246
@ CONFIG_START_PLAYER_MONEY
Definition IWorld.h:240
@ CONFIG_START_PLAYER_LEVEL
Definition IWorld.h:238
@ CONFIG_START_HONOR_POINTS
Definition IWorld.h:244
@ ITEM_CLASS_CONSUMABLE
Definition ItemTemplate.h:291
@ ITEM_SUBCLASS_FOOD
Definition ItemTemplate.h:319
@ REST_STATE_RAF_LINKED
Definition Player.h:991
@ REST_STATE_NOT_RAF_LINKED
Definition Player.h:990
@ REALM_TYPE_RPPVP
Definition Realm.h:58
@ REALM_TYPE_PVP
Definition Realm.h:55
@ POWER_RUNIC_POWER
Definition SharedDefines.h:275
@ POWER_RUNE
Definition SharedDefines.h:274
@ SPELL_CATEGORY_DRINK
Definition SharedDefines.h:344
@ SPELL_CATEGORY_FOOD
Definition SharedDefines.h:343
@ CLASS_CONTEXT_INIT
Definition UnitDefines.h:227
@ UNIT_FLAG2_REGENERATE_POWER
Definition UnitDefines.h:299
@ UNIT_BYTE2_FLAG_PVP
Definition UnitDefines.h:136
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:253
@ PLAYER_GUILD_TIMESTAMP
Definition UpdateFields.h:185
@ PLAYER_GUILDID
Definition UpdateFields.h:179
@ PLAYER_FIELD_COINAGE
Definition UpdateFields.h:359
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137
@ PLAYER_GUILDRANK
Definition UpdateFields.h:180
@ UNIT_FIELD_HOVERHEIGHT
Definition UpdateFields.h:173
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
uint8 HairColor
Definition WorldSession.h:281
uint8 Skin
Definition WorldSession.h:278
uint8 Class
Definition WorldSession.h:276
std::string Name
User specified variables.
Definition WorldSession.h:274
uint8 FacialHair
Definition WorldSession.h:282
uint8 HairStyle
Definition WorldSession.h:280
uint8 Face
Definition WorldSession.h:279
uint8 Gender
Definition WorldSession.h:277
uint8 Race
Definition WorldSession.h:275
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition Object.cpp:134
void SetInt32Value(uint16 index, int32 value)
Definition Object.cpp:637
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:737
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:671
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:911
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition Player.cpp:697
void InitPrimaryProfessions()
Definition Player.cpp:11547
void InitGlyphsForLevel()
Definition Player.cpp:13326
void UpdateMaxPower(Powers power) override
Definition StatSystem.cpp:309
void LearnCustomSpells()
Definition Player.cpp:11874
void SetArenaPoints(uint32 value)
Definition Player.cpp:6296
void SetObjectScale(float scale) override
Definition Player.h:1095
void InitDisplayIds()
Definition Player.cpp:10656
InventoryResult CanUseAmmo(uint32 item) const
Definition PlayerStorage.cpp:2462
void SetAmmo(uint32 item)
Definition PlayerStorage.cpp:2492
void SetHonorPoints(uint32 value)
Definition Player.cpp:6275
void InitTaxiNodesForLevel()
Definition Player.h:1161
void InitStatsForLevel(bool reapplyMods=false)
Definition Player.cpp:2595
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition PlayerStorage.cpp:2727
void InitRunes()
Definition Player.cpp:13496
void SetMap(Map *map) override
Definition Player.cpp:14712
void SetFactionForRace(uint8 race)
Definition Player.cpp:5883
void CheckAllAchievementCriteria()
Definition Player.cpp:13941
bool HasActivePowerType(Powers power) override
Definition Player.cpp:2763
void LearnDefaultSkills()
Definition Player.cpp:11900
void SetFullHealth()
Definition Unit.h:1056
uint8 m_realRace
Definition Unit.h:2055
uint8 m_race
Definition Unit.h:2056
void SetUnitFlag2(UnitFlags2 flags)
Definition Unit.h:725
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15697
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:719
Definition DBCStructure.h:619
Definition DBCStructure.h:652
uint32 powerType
Definition DBCStructure.h:655
float orientation
Definition Player.h:349
PlayerCreateInfoActions action
Definition Player.h:355
PlayerCreateInfoItems item
Definition Player.h:352
void Relocate(float x, float y)
Definition Position.h:72
uint32 SpellCategory
Definition ItemTemplate.h:596

References Object::_Create(), PlayerInfo::action, addActionButton(), ItemTemplate::BuyCount, CanEquipItem(), CanStoreItem(), CanUseAmmo(), CheckAllAchievementCriteria(), ItemTemplate::Class, CharacterCreateInfo::Class, CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, CONFIG_GAME_TYPE, CONFIG_START_ARENA_POINTS, CONFIG_START_GM_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_MONEY, CONFIG_START_HONOR_POINTS, CONFIG_START_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, EQUIP_ERR_OK, EquipItem(), CharacterCreateInfo::Face, CharacterCreateInfo::FacialHair, CharacterCreateInfo::Gender, GetCharStartOutfitEntry(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, HasActivePowerType(), InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, IsClass(), AccountMgr::IsPlayerAccount(), IsValidGender(), PlayerInfo::item, ITEM_CLASS_CONSUMABLE, ITEM_SUBCLASS_FOOD, KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), LOG_ERROR, m_items, m_Last_tick, WorldObject::m_name, m_Played_time, Unit::m_race, Unit::m_realRace, PlayerInfo::mapId, MAX_OUTFIT_ITEMS, CharacterCreateInfo::Name, NULL_BAG, NULL_SLOT, PlayerInfo::orientation, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, Player, PLAYER__FIELD_KNOWN_TITLES, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_FIELD_COINAGE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_GUILD_TIMESTAMP, PLAYER_GUILDID, PLAYER_GUILDRANK, PLAYER_SLOTS_COUNT, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, POWER_MANA, POWER_RUNE, POWER_RUNIC_POWER, ChrClassesEntry::powerType, CharacterCreateInfo::Race, REALM_TYPE_PVP, REALM_TYPE_RPPVP, Position::Relocate(), RemoveItem(), REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, sChrClassesStore, SetAmmo(), SetArenaPoints(), Object::SetByteFlag(), Object::SetByteValue(), SetFactionForRace(), Object::SetFloatValue(), Unit::SetFullHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetUInt32Value(), Object::SetUInt64Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), CharacterCreateInfo::Skin, sMapMgr, sObjectMgr, SPELL_CATEGORY_DRINK, SPELL_CATEGORY_FOOD, _Spell::SpellCategory, ItemTemplate::Spells, StoreItem(), StoreNewItemInBestSlots(), ItemTemplate::SubClass, sWorld, UNIT_BYTE2_FLAG_PVP, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_2, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MOD_CAST_SPEED, UpdateAllStats(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4614{
4615 // prevent existence 2 corpse for player
4617
4618 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4619
4621 SetPvPDeath(false);
4622
4623 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4624 {
4625 delete corpse;
4626 return nullptr;
4627 }
4628
4630
4631 _uf = getRace();
4634
4635 uint8 race = (uint8)(_uf);
4636 uint8 skin = (uint8)(_pb);
4637 uint8 face = (uint8)(_pb >> 8);
4638 uint8 hairstyle = (uint8)(_pb >> 16);
4639 uint8 haircolor = (uint8)(_pb >> 24);
4640 uint8 facialhair = (uint8)(_pb2);
4641
4642 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4643 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4644
4645 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4646 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4647
4648 uint32 flags = CORPSE_FLAG_UNK2;
4650 flags |= CORPSE_FLAG_HIDE_HELM;
4652 flags |= CORPSE_FLAG_HIDE_CLOAK;
4653
4654 // Xinef: Player can loop corpses while in BG or in WG
4655 if (InBattleground() && !InArena())
4656 flags |= CORPSE_FLAG_LOOTABLE;
4657 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4658 if (Bf && Bf->IsWarTime())
4659 flags |= CORPSE_FLAG_LOOTABLE;
4660
4661 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4662
4664
4666
4667 uint32 iDisplayID;
4668 uint32 iIventoryType;
4669 uint32 _cfi;
4670 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4671 {
4672 if (m_items[i])
4673 {
4674 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4675 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4676
4677 _cfi = iDisplayID | (iIventoryType << 24);
4678 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4679 }
4680 }
4681
4682 // register for player, but not show
4683 GetMap()->AddCorpse(corpse);
4684
4686
4687 // we do not need to save corpses for BG/arenas
4688 if (!GetMap()->IsBattlegroundOrArena())
4689 corpse->SaveToDB();
4690
4691 return corpse;
4692}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:35
@ CORPSE_RESURRECTABLE_PVE
Definition Corpse.h:29
@ CORPSE_FLAG_HIDE_CLOAK
Definition Corpse.h:44
@ CORPSE_FLAG_UNK2
Definition Corpse.h:42
@ CORPSE_FLAG_HIDE_HELM
Definition Corpse.h:43
@ CORPSE_FLAG_LOOTABLE
Definition Corpse.h:45
@ CORPSE_FIELD_BYTES_2
Definition UpdateFields.h:425
@ CORPSE_FIELD_FLAGS
Definition UpdateFields.h:427
@ CORPSE_FIELD_BYTES_1
Definition UpdateFields.h:424
@ CORPSE_FIELD_DISPLAY_ID
Definition UpdateFields.h:422
@ CORPSE_FIELD_ITEM
Definition UpdateFields.h:423
@ CORPSE_FIELD_GUILD
Definition UpdateFields.h:426
Definition Battlefield.h:204
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition Battlefield.h:247
void SaveToDB()
Definition Corpse.cpp:90
bool Create(ObjectGuid::LowType guidlow)
Definition Corpse.cpp:61
void AddCorpse(Corpse *corpse)
Definition Map.cpp:3611
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:650
WorldLocation _corpseLocation
Definition Player.h:3009
void SpawnCorpseBones(bool triggerSave=true)
Definition Player.cpp:4708
void SetPvPDeath(bool on)
Definition Player.h:1185
bool InArena() const
Definition Player.cpp:12334
uint32 GetNativeDisplayId() const
Definition Unit.h:1889
void WorldRelocate(const WorldLocation &loc)
Definition Position.h:258
void UpdatePositionData()
Definition Object.cpp:1165

References _corpseLocation, Map::AddCorpse(), BATTLEFIELD_BATTLEID_WG, CORPSE_FIELD_BYTES_1, CORPSE_FIELD_BYTES_2, CORPSE_FIELD_DISPLAY_ID, CORPSE_FIELD_FLAGS, CORPSE_FIELD_GUILD, CORPSE_FIELD_ITEM, CORPSE_FLAG_HIDE_CLOAK, CORPSE_FLAG_HIDE_HELM, CORPSE_FLAG_LOOTABLE, CORPSE_FLAG_UNK2, CORPSE_RESURRECTABLE_PVE, CORPSE_RESURRECTABLE_PVP, Corpse::Create(), ItemTemplate::DisplayInfoID, EQUIPMENT_SLOT_END, Object::GetByteValue(), GetGuildId(), WorldObject::GetMap(), Unit::GetNativeDisplayId(), Unit::getRace(), Item::GetTemplate(), Object::GetUInt32Value(), HasPlayerFlag(), InArena(), InBattleground(), ItemTemplate::InventoryType, Battlefield::IsWarTime(), m_ExtraFlags, m_items, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_EXTRA_PVP_DEATH, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, Corpse::SaveToDB(), sBattlefieldMgr, SetPvPDeath(), Object::SetUInt32Value(), SpawnCorpseBones(), WorldObject::UpdatePositionData(), and WorldLocation::WorldRelocate().

Referenced by BuildPlayerRepop().

◆ CreatePet() [1/2]

Pet * Player::CreatePet ( Creature creatureTarget,
uint32  spellID = 0 
)
9239{
9240 if (IsExistPet())
9241 {
9242 return nullptr;
9243 }
9244
9245 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->IsPlayer())
9246 {
9247 return nullptr;
9248 }
9249
9250 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9251 if (!creatrueTemplate->family)
9252 {
9253 // Creatures with family 0 crashes the server
9254 return nullptr;
9255 }
9256
9257 // Everything looks OK, create new pet
9258 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9259 if (!pet)
9260 {
9261 return nullptr;
9262 }
9263
9264 // "kill" original creature
9265 creatureTarget->DespawnOrUnsummon();
9266
9267 // calculate proper level
9268 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9269
9270 // prepare visual effect for levelup
9271 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9272
9273 // add to world
9274 pet->GetMap()->AddToMap(pet->ToCreature());
9275
9276 // visual effect for levelup
9277 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9278
9279 // caster have pet now
9280 SetMinion(pet, true);
9281
9282 pet->InitTalentForLevel();
9283
9286
9287 return pet;
9288}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition Creature.cpp:2185
void InitTalentForLevel()
Definition Pet.cpp:2219
void SavePetToDB(PetSaveMode mode)
Definition Pet.cpp:501
bool IsExistPet()
Definition Player.cpp:9232
void PetSpellInitialize()
Definition Player.cpp:9505
void SetMinion(Minion *minion, bool apply)
Definition Unit.cpp:10744
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition Unit.cpp:17417
bool IsPet() const
Definition Unit.h:763
uint32 family
Definition CreatureData.h:217

References Map::AddToMap(), Unit::CreateTamedPetFrom(), Creature::DespawnOrUnsummon(), CreatureTemplate::family, Object::GetEntry(), Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), Unit::IsPet(), Object::IsPlayer(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

Referenced by npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9291{
9292 if (IsExistPet())
9293 {
9294 return nullptr;
9295 }
9296
9297 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9298 if (!creatrueTemplate->family)
9299 {
9300 // Creatures with family 0 crashes the server
9301 return nullptr;
9302 }
9303
9304 // Everything looks OK, create new pet
9305 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9306 if (!pet)
9307 {
9308 return nullptr;
9309 }
9310
9311 // prepare visual effect for levelup
9313
9314 // add to world
9315 pet->GetMap()->AddToMap(pet->ToCreature());
9316
9317 // visual effect for levelup
9319
9320 // caster have pet now
9321 SetMinion(pet, true);
9322
9323 pet->InitTalentForLevel();
9324
9327
9328 return pet;
9329}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

◆ Customize()

void Player::Customize ( CharacterCustomizeInfo const *  customizeInfo,
CharacterDatabaseTransaction  trans 
)
static
115{
117 stmt->SetData(0, customizeInfo->Gender);
118 stmt->SetData(1, customizeInfo->Skin);
119 stmt->SetData(2, customizeInfo->Face);
120 stmt->SetData(3, customizeInfo->HairStyle);
121 stmt->SetData(4, customizeInfo->HairColor);
122 stmt->SetData(5, customizeInfo->FacialHair);
123 stmt->SetData(6, customizeInfo->Guid.GetCounter());
124
125 CharacterDatabase.ExecuteOrAppend(trans, stmt);
126}
@ CHAR_UPD_GENDER_AND_APPEARANCE
Definition CharacterDatabase.h:315

References CHAR_UPD_GENDER_AND_APPEARANCE, CharacterDatabase, CharacterCustomizeInfo::Face, CharacterCustomizeInfo::FacialHair, CharacterCustomizeInfo::Gender, ObjectGuid::GetCounter(), CharacterRenameInfo::Guid, CharacterCustomizeInfo::HairColor, CharacterCustomizeInfo::HairStyle, PreparedStatementBase::SetData(), and CharacterCustomizeInfo::Skin.

Referenced by WorldSession::HandleCharCustomizeCallback(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ DeleteEquipmentSet()

void Player::DeleteEquipmentSet ( uint64  setGuid)
14660{
14661 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14662 {
14663 if (itr->second.Guid == setGuid)
14664 {
14665 if (itr->second.state == EQUIPMENT_SET_NEW)
14666 m_EquipmentSets.erase(itr);
14667 else
14668 itr->second.state = EQUIPMENT_SET_DELETED;
14669 break;
14670 }
14671 }
14672}

References EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, and m_EquipmentSets.

Referenced by WorldSession::HandleEquipmentSetDelete().

◆ DeleteFromDB()

void Player::DeleteFromDB ( ObjectGuid::LowType  lowGuid,
uint32  accountId,
bool  updateRealmChars,
bool  deleteFinally 
)
static

Deletes a character from the database

The way, how the characters will be deleted is decided based on the config option.

Parameters
playerguidthe low-GUID from the player which should be deleted
accountIdthe account id from the player
updateRealmCharswhen this flag is set, the amount of characters on that realm will be updated in the realmlist
deleteFinallyif this flag is set, the config option will be ignored and the character will be permanently removed from the database
3989{
3990 // for not existed account avoid update realm
3991 if (!accountId)
3992 updateRealmChars = false;
3993
3994 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3995
3996 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3997 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3998
3999 // if we want to finally delete the character or the character does not meet the level requirement,
4000 // we set it to mode CHAR_DELETE_REMOVE
4001 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
4002 charDelete_method = CHAR_DELETE_REMOVE;
4003
4004 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
4005 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
4006 guild->DeleteMember(playerGuid, false, false, true);
4007
4008 // remove from arena teams
4009 LeaveAllArenaTeams(playerGuid);
4010
4011 // close player ticket if any
4012 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
4013 if (ticket)
4014 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
4015
4016 // remove from group
4017 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(playerGuid))
4018 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
4019 RemoveFromGroup(group, playerGuid);
4020
4021 // Remove signs from petitions (also remove petitions if owner);
4022 RemovePetitionsAndSigns(playerGuid, 10);
4023
4024 CharacterDatabasePreparedStatement* stmt = nullptr;
4025
4026 switch (charDelete_method)
4027 {
4028 // Completely remove from the database
4029 case CHAR_DELETE_REMOVE:
4030 {
4031 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4032
4033 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
4034 stmt->SetData(0, lowGuid);
4035 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
4036
4037 if (resultMail)
4038 {
4039 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
4040
4041 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
4042 stmt->SetData(0, lowGuid);
4043 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
4044
4045 if (resultItems)
4046 {
4047 do
4048 {
4049 Field* fields = resultItems->Fetch();
4050 uint32 mailId = fields[14].Get<uint32>();
4051 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
4052 {
4053 itemsByMail[mailId].push_back(mailItem);
4054 }
4055 } while (resultItems->NextRow());
4056 }
4057
4058 do
4059 {
4060 Field* mailFields = resultMail->Fetch();
4061
4062 uint32 mail_id = mailFields[0].Get<uint32>();
4063 uint8 mailType = mailFields[1].Get<uint8>();
4064 uint16 mailTemplateId = mailFields[2].Get<uint16>();
4065 uint32 sender = mailFields[3].Get<uint32>();
4066 std::string subject = mailFields[4].Get<std::string>();
4067 std::string body = mailFields[5].Get<std::string>();
4068 uint32 money = mailFields[6].Get<uint32>();
4069 bool has_items = mailFields[7].Get<bool>();
4070
4071 // We can return mail now
4072 // So firstly delete the old one
4073 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4074 stmt->SetData(0, mail_id);
4075 trans->Append(stmt);
4076
4077 // Mail is not from player
4078 if (mailType != MAIL_NORMAL)
4079 {
4080 if (has_items)
4081 {
4082 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4083 stmt->SetData(0, mail_id);
4084 trans->Append(stmt);
4085 }
4086 continue;
4087 }
4088
4089 MailDraft draft(subject, body);
4090 if (mailTemplateId)
4091 draft = MailDraft(mailTemplateId, false); // items are already included
4092
4093 auto itemsItr = itemsByMail.find(mail_id);
4094 if (itemsItr != itemsByMail.end())
4095 {
4096 for (Item* item : itemsItr->second)
4097 {
4098 draft.AddItem(item);
4099 }
4100
4101 // MailDraft will take care of freeing memory.
4102 itemsByMail.erase(itemsItr);
4103 }
4104
4105 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4106 stmt->SetData(0, mail_id);
4107 trans->Append(stmt);
4108
4109 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4110
4111 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4112 } while (resultMail->NextRow());
4113 }
4114
4115 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4116 // NOW we can finally clear other DB data related to character
4117 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4118 stmt->SetData(0, lowGuid);
4119 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4120
4121 if (resultPets)
4122 {
4123 do
4124 {
4125 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4126 Pet::DeleteFromDB(petguidlow);
4127 } while (resultPets->NextRow());
4128 }
4129
4130 // Delete char from social list of online chars
4131 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4132 stmt->SetData(0, lowGuid);
4133 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4134
4135 if (resultFriends)
4136 {
4137 do
4138 {
4139 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4140 {
4141 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4142 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4143 }
4144 } while (resultFriends->NextRow());
4145 }
4146
4147 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4148 stmt->SetData(0, lowGuid);
4149 trans->Append(stmt);
4150
4151 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4152 stmt->SetData(0, lowGuid);
4153 trans->Append(stmt);
4154
4155 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4156 stmt->SetData(0, lowGuid);
4157 trans->Append(stmt);
4158
4159 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4160 stmt->SetData(0, lowGuid);
4161 trans->Append(stmt);
4162
4163 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4164 stmt->SetData(0, lowGuid);
4165 trans->Append(stmt);
4166
4167 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4168 stmt->SetData(0, lowGuid);
4169 trans->Append(stmt);
4170
4171 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4172 stmt->SetData(0, lowGuid);
4173 trans->Append(stmt);
4174
4175 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4176 stmt->SetData(0, lowGuid);
4177 trans->Append(stmt);
4178
4179 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4180 stmt->SetData(0, lowGuid);
4181 trans->Append(stmt);
4182
4183 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4184 stmt->SetData(0, lowGuid);
4185 trans->Append(stmt);
4186
4187 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4188 stmt->SetData(0, lowGuid);
4189 trans->Append(stmt);
4190
4191 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4192 stmt->SetData(0, lowGuid);
4193 trans->Append(stmt);
4194
4195 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4196 stmt->SetData(0, lowGuid);
4197 trans->Append(stmt);
4198
4199 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4200 stmt->SetData(0, lowGuid);
4201 trans->Append(stmt);
4202
4203 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4204 {
4206 stmt->SetData(0, lowGuid);
4207 trans->Append(stmt);
4208 }
4209 else
4210 {
4211 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4212 stmt->SetData(0, lowGuid);
4213 trans->Append(stmt);
4214 }
4215
4216 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4217 stmt->SetData(0, lowGuid);
4218 trans->Append(stmt);
4219
4220 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4221 stmt->SetData(0, lowGuid);
4222 trans->Append(stmt);
4223
4224 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4225 stmt->SetData(0, lowGuid);
4226 trans->Append(stmt);
4227
4228 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4229 stmt->SetData(0, lowGuid);
4230 trans->Append(stmt);
4231
4232 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4233 stmt->SetData(0, lowGuid);
4234 trans->Append(stmt);
4235
4236 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4237 stmt->SetData(0, lowGuid);
4238 trans->Append(stmt);
4239
4241 stmt->SetData(0, lowGuid);
4242 trans->Append(stmt);
4243
4244 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4245 stmt->SetData(0, lowGuid);
4246 trans->Append(stmt);
4247
4248 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4249 stmt->SetData(0, lowGuid);
4250 trans->Append(stmt);
4251
4252 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4253 stmt->SetData(0, lowGuid);
4254 trans->Append(stmt);
4255
4256 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4257 stmt->SetData(0, lowGuid);
4258 stmt->SetData(1, lowGuid);
4259 trans->Append(stmt);
4260
4261 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4262 stmt->SetData(0, lowGuid);
4263 trans->Append(stmt);
4264
4265 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4266 stmt->SetData(0, lowGuid);
4267 trans->Append(stmt);
4268
4269 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4270 stmt->SetData(0, lowGuid);
4271 trans->Append(stmt);
4272
4273 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4274 stmt->SetData(0, lowGuid);
4275 trans->Append(stmt);
4276
4277 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4278 stmt->SetData(0, lowGuid);
4279 trans->Append(stmt);
4280
4281 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4282 stmt->SetData(0, lowGuid);
4283 trans->Append(stmt);
4284
4285 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4286 stmt->SetData(0, lowGuid);
4287 trans->Append(stmt);
4288
4289 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4290 stmt->SetData(0, lowGuid);
4291 trans->Append(stmt);
4292
4293 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4294 stmt->SetData(0, lowGuid);
4295 trans->Append(stmt);
4296
4297 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4298 stmt->SetData(0, lowGuid);
4299 trans->Append(stmt);
4300
4301 Corpse::DeleteFromDB(playerGuid, trans);
4302
4303 sScriptMgr->OnDeleteFromDB(trans, lowGuid);
4304
4305 CharacterDatabase.CommitTransaction(trans);
4306 break;
4307 }
4308 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4309 case CHAR_DELETE_UNLINK:
4310 {
4311 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4312
4313 stmt->SetData(0, lowGuid);
4314
4315 CharacterDatabase.Execute(stmt);
4316 break;
4317 }
4318 default:
4319 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4320 return;
4321 }
4322
4323 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4324 {
4325 std::string name = cache->Name;
4326 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4327 }
4328
4329 if (updateRealmChars)
4330 {
4331 sWorld->UpdateRealmCharCount(accountId);
4332 }
4333}
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition CharacterDatabase.h:393
@ CHAR_DEL_CHAR_GIFT
Definition CharacterDatabase.h:408
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition CharacterDatabase.h:476
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition CharacterDatabase.h:419
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition CharacterDatabase.h:418
@ CHAR_DEL_CHAR_SKILLS
Definition CharacterDatabase.h:422
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition CharacterDatabase.h:475
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition CharacterDatabase.h:384
@ CHAR_SEL_MAILITEMS
Definition CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition CharacterDatabase.h:292
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition CharacterDatabase.h:417
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition CharacterDatabase.h:414
@ CHAR_DEL_CHAR_TALENT
Definition CharacterDatabase.h:421
@ CHAR_SEL_CHAR_SOCIAL
Definition CharacterDatabase.h:348
@ CHAR_DEL_CHAR_INVENTORY
Definition CharacterDatabase.h:410
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition CharacterDatabase.h:391
@ CHAR_DEL_CHAR_ACTION
Definition CharacterDatabase.h:406
@ CHAR_SEL_CHAR_PET_IDS
Definition CharacterDatabase.h:478
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition CharacterDatabase.h:416
@ CHAR_SEL_CHAR_COD_ITEM_MAIL
Definition CharacterDatabase.h:347
@ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION
Definition CharacterDatabase.h:265
@ CHAR_DEL_CHAR_REPUTATION
Definition CharacterDatabase.h:412
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition CharacterDatabase.h:364
@ CHAR_DEL_CHARACTER
Definition CharacterDatabase.h:405
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition CharacterDatabase.h:392
@ CHAR_DEL_CHAR_SETTINGS
Definition CharacterDatabase.h:522
@ CHAR_DEL_CHAR_SPELL
Definition CharacterDatabase.h:413
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition CharacterDatabase.h:411
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition CharacterDatabase.h:264
@ CHAR_DEL_MAIL_ITEMS
Definition CharacterDatabase.h:415
@ CHAR_DEL_CHAR_INSTANCE
Definition CharacterDatabase.h:409
#define sGuildMgr
Definition GuildMgr.h:51
@ CONFIG_CHARDELETE_METHOD
Definition IWorld.h:354
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition IWorld.h:355
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition IWorld.h:136
@ MAIL_NORMAL
Definition Mail.h:37
@ CHAR_DELETE_REMOVE
Definition Player.h:958
@ CHAR_DELETE_UNLINK
Definition Player.h:959
@ FRIEND_REMOVED
Definition SocialMgr.h:71
#define sSocialMgr
Definition SocialMgr.h:147
@ SOCIAL_FLAG_ALL
Definition SocialMgr.h:44
#define sTicketMgr
Definition TicketMgr.h:260
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition Corpse.cpp:119
Definition TicketMgr.h:88
uint32 GetId() const
Definition TicketMgr.h:101
Definition Guild.h:292
void DeleteFromDB() override
Definition Pet.h:171
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Player.cpp:2367
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10145
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition Player.cpp:10213
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition ObjectAccessor.cpp:251
Definition CharacterCache.h:28

References _LoadMailedItem(), MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_ACTION, CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_DECLINED_NAME, CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_CHAR_GIFT, CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_PET_BY_OWNER, CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, CHAR_DEL_CHAR_QUESTSTATUS, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, CHAR_DEL_CHAR_SETTINGS, CHAR_DEL_CHAR_SKILLS, CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, CHAR_DEL_CHAR_SOCIAL_BY_GUID, CHAR_DEL_CHAR_SPELL, CHAR_DEL_CHAR_SPELL_COOLDOWN, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHARACTER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, CHAR_DEL_MAIL, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_DEL_MAIL_ITEMS, CHAR_DEL_PLAYER_ACCOUNT_DATA, CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_DEL_PLAYER_GM_TICKETS, CHAR_DEL_PLAYER_HOMEBIND, CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_DELETE_REMOVE, CHAR_DELETE_UNLINK, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_PET_IDS, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_MAILITEMS, CHAR_UPD_DELETE_INFO, CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, CharacterDatabase, CONFIG_CHARDELETE_METHOD, CONFIG_CHARDELETE_MIN_LEVEL, CONFIG_DELETE_CHARACTER_TICKET_TRACE, Pet::DeleteFromDB(), Corpse::DeleteFromDB(), ObjectAccessor::FindPlayerByLowGUID(), FRIEND_REMOVED, Field::Get(), GmTicket::GetId(), LeaveAllArenaTeams(), LOG_ERROR, MAIL_NORMAL, Player, RemoveFromGroup(), RemovePetitionsAndSigns(), sCharacterCache, MailDraft::SendReturnToSender(), PreparedStatementBase::SetData(), sGroupMgr, sGuildMgr, SOCIAL_FLAG_ALL, sScriptMgr, sSocialMgr, sTicketMgr, and sWorld.

Referenced by AccountMgr::DeleteAccount(), DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedDeleteCommand(), character_commandscript::HandleCharacterEraseCommand(), and WorldSession::HandleCharDeleteOpcode().

◆ DeleteOldCharacters() [1/2]

void Player::DeleteOldCharacters ( )
static

Characters which were kept back in the database after being deleted and are now too old (see config option "CharDelete.KeepDays"), will be completely deleted.

4339{
4340 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4341 if (!keepDays)
4342 return;
4343
4345}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition IWorld.h:353
static void DeleteOldCharacters()
Definition Player.cpp:4338

References CONFIG_CHARDELETE_KEEP_DAYS, DeleteOldCharacters(), and sWorld.

Referenced by DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedPurgeCommand(), and World::SetInitialWorldSettings().

◆ DeleteOldCharacters() [2/2]

void Player::DeleteOldCharacters ( uint32  keepDays)
static

Characters which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4351{
4352 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4353 LOG_INFO("server.loading", " ");
4354
4356 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4357 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4358
4359 if (result)
4360 {
4361 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4362 do
4363 {
4364 Field* fields = result->Fetch();
4365 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4366 } while (result->NextRow());
4367 }
4368}
@ CHAR_SEL_CHAR_OLD_CHARS
Definition CharacterDatabase.h:349
constexpr auto DAY
Definition Common.h:49
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition Player.cpp:3988

References CHAR_SEL_CHAR_OLD_CHARS, CharacterDatabase, DAY, DeleteFromDB(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteOldRecoveryItems() [1/2]

void Player::DeleteOldRecoveryItems ( )
static

Items which were kept back in the database after being deleted and are now too old (see config option "ItemDelete.KeepDays"), will be completely deleted.

4374{
4375 uint32 keepDays = sWorld->getIntConfig(CONFIG_ITEMDELETE_KEEP_DAYS);
4376 if (!keepDays)
4377 return;
4378
4380}
@ CONFIG_ITEMDELETE_KEEP_DAYS
Definition IWorld.h:389
static void DeleteOldRecoveryItems()
Definition Player.cpp:4373

References CONFIG_ITEMDELETE_KEEP_DAYS, DeleteOldRecoveryItems(), and sWorld.

Referenced by DeleteOldRecoveryItems(), and World::SetInitialWorldSettings().

◆ DeleteOldRecoveryItems() [2/2]

void Player::DeleteOldRecoveryItems ( uint32  keepDays)
static

Items which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4386{
4387 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Deleting all items which have been deleted {} days before...", keepDays);
4388 LOG_INFO("server.loading", " ");
4389
4391 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4392 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4393
4394 if (result)
4395 {
4396 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Found {} item(s) to delete", result->GetRowCount());
4397 do
4398 {
4399 Field* fields = result->Fetch();
4400
4401 uint32 guid = fields[0].Get<uint32>();
4402 uint32 itemEntry = fields[1].Get<uint32>();
4403
4405 deleteStmt->SetData(0, guid);
4406 CharacterDatabase.Execute(deleteStmt);
4407
4408 LOG_INFO("server.loading", "Deleted item from recovery_item table where guid {} and item id {}", guid, itemEntry);
4409 } while (result->NextRow());
4410 }
4411}
@ CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS
Definition CharacterDatabase.h:511
@ CHAR_DEL_RECOVERY_ITEM_BY_GUID
Definition CharacterDatabase.h:512

References CHAR_DEL_RECOVERY_ITEM_BY_GUID, CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS, CharacterDatabase, DAY, Field::Get(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15550{
15551 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15552 if (itr != m_refundableItems.end())
15553 m_refundableItems.erase(itr);
15554}

References m_refundableItems.

Referenced by _SaveInventory(), Item::SetNotRefundable(), and Item::SetState().

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3343{
3344 // used when entering arena
3345 // destroys all conjured items
3346 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3347
3348 // in inventory
3350 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3351 if (pItem->IsConjuredConsumable())
3353
3354 // in inventory bags
3356 if (Bag* pBag = GetBagByPos(i))
3357 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3358 if (Item* pItem = pBag->GetItemByPos(j))
3359 if (pItem->IsConjuredConsumable())
3360 DestroyItem(i, j, update);
3361
3362 // in equipment and bag list
3364 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3365 if (pItem->IsConjuredConsumable())
3367}

References DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and LOG_DEBUG.

Referenced by Battleground::AddPlayer().

◆ DestroyForPlayer()

void Player::DestroyForPlayer ( Player target,
bool  onDeath = false 
) const
overridevirtual

Reimplemented from Object.

3862{
3863 Unit::DestroyForPlayer(target, onDeath);
3864
3865 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3866 {
3867 if (!m_items[i])
3868 continue;
3869
3870 m_items[i]->DestroyForPlayer(target);
3871 }
3872
3873 if (target == this)
3874 {
3876 {
3877 if (!m_items[i])
3878 continue;
3879
3880 m_items[i]->DestroyForPlayer(target);
3881 }
3883 {
3884 if (!m_items[i])
3885 continue;
3886
3887 m_items[i]->DestroyForPlayer(target);
3888 }
3889 }
3890}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, Object::DestroyForPlayer(), EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

◆ DestroyItem()

void Player::DestroyItem ( uint8  bag,
uint8  slot,
bool  update 
)
3024{
3025 Item* pItem = GetItemByPos(bag, slot);
3026 if (pItem)
3027 {
3028 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3029 // Also remove all contained items if the item is a bag.
3030 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3031 if (pItem->IsNotEmptyBag())
3032 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3033 DestroyItem(slot, i, update);
3034
3035 if (pItem->IsWrapped())
3036 {
3038 stmt->SetData(0, pItem->GetGUID().GetCounter());
3039 CharacterDatabase.Execute(stmt);
3040 }
3041
3043 RemoveItemDurations(pItem);
3044
3045 pItem->SetNotRefundable(this);
3046 pItem->ClearSoulboundTradeable(this);
3047 RemoveTradeableItem(pItem);
3048
3049 ItemTemplate const* proto = pItem->GetTemplate();
3050 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3051 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
3053
3054 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3055
3056 sScriptMgr->OnItemRemove(this, pItem);
3057
3058 if (bag == INVENTORY_SLOT_BAG_0)
3059 {
3061
3062 // equipment and equipped bags can have applied bonuses
3063 if (slot < INVENTORY_SLOT_BAG_END)
3064 {
3065 ItemTemplate const* pProto = pItem->GetTemplate();
3066
3067 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3068 if (pProto && pProto->ItemSet)
3069 RemoveItemsSetItem(this, pProto);
3070
3071 _ApplyItemMods(pItem, slot, false);
3072 }
3073
3074 if (slot < EQUIPMENT_SLOT_END)
3075 {
3076 // remove item dependent auras and casts (only weapon and armor slots)
3078
3079 // update expertise and armor penetration - passive auras may need it
3080 switch (slot)
3081 {
3086 default:
3087 break;
3088 }
3089
3090 if (slot == EQUIPMENT_SLOT_MAINHAND)
3092 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3094
3095 // equipment visual show
3096 SetVisibleItemSlot(slot, nullptr);
3097 }
3098
3099 m_items[slot] = nullptr;
3100 }
3101 else if (Bag* pBag = GetBagByPos(bag))
3102 pBag->RemoveItem(slot, update);
3103
3104 // Xinef: item is removed, remove loot from storage if any
3105 if (proto->HasFlag(ITEM_FLAG_HAS_LOOT))
3106 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3107
3108 if (IsInWorld() && update)
3109 {
3110 pItem->RemoveFromWorld();
3111 pItem->DestroyForPlayer(this);
3112 }
3113
3114 //pItem->SetOwnerGUID(0);
3116 pItem->SetSlot(NULL_SLOT);
3117 pItem->SetState(ITEM_REMOVED, this);
3118 }
3119}
@ CHAR_DEL_GIFT
Definition CharacterDatabase.h:130
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition ItemTemplate.h:87
bool IsWrapped() const
Definition Item.h:263
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition PlayerQuest.cpp:1874
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition Player.cpp:12617
void RecalculateRating(CombatRating cr)
Definition Player.h:1969
void UpdateExpertise(WeaponAttackType attType)
Definition StatSystem.cpp:877
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition PlayerStorage.cpp:2858

References _ApplyItemMods(), BASE_ATTACK, CHAR_DEL_GIFT, CharacterDatabase, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), DestroyItem(), ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), Item::IsWrapped(), ITEM_FIELD_CONTAINED, ITEM_FLAG_HAS_LOOT, ITEM_REMOVED, ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, ItemRemovedQuestCheck(), ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_BAG_SIZE, MAX_ITEM_PROTO_SPELLS, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), Unit::RemoveAurasDueToSpell(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), PreparedStatementBase::SetData(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetSlot(), Item::SetState(), SetVisibleItemSlot(), sLootItemStorage, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, and UpdateExpertise().

Referenced by AddQuestAndCheckCompletion(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyItemCount(), DestroyZoneLimitedItem(), WorldSession::DoLootRelease(), Spell::EffectSummonChangeItem(), bg_commandscript::HandleBagsClearCommand(), debug_commandscript::HandleDebugItemExpireCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), RefundItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3398{
3399 if (!pItem)
3400 return;
3401
3402 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3403
3404 if (pItem->GetCount() <= count)
3405 {
3406 count -= pItem->GetCount();
3407
3408 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3409 }
3410 else
3411 {
3412 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3413 pItem->SetCount(pItem->GetCount() - count);
3414 count = 0;
3415 if (IsInWorld() && update)
3416 pItem->SendUpdateToPlayer(this);
3417 pItem->SetState(ITEM_CHANGED, this);
3418 }
3419}

References DestroyItem(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetSlot(), Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), LOG_DEBUG, Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), and ObjectGuid::ToString().

◆ DestroyItemCount() [2/2]

void Player::DestroyItemCount ( uint32  item,
uint32  count,
bool  update,
bool  unequip_check = false 
)
3122{
3123 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = {}, count = {}", itemEntry, count);
3124 uint32 remcount = 0;
3125
3126 // in inventory
3128 {
3129 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3130 {
3131 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3132 {
3133 if (item->GetCount() + remcount <= count)
3134 {
3135 // all items in inventory can unequipped
3136 remcount += item->GetCount();
3138
3139 if (remcount >= count)
3140 return;
3141 }
3142 else
3143 {
3144 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3145 item->SetCount(item->GetCount() - count + remcount);
3146 if (IsInWorld() && update)
3147 item->SendUpdateToPlayer(this);
3148 item->SetState(ITEM_CHANGED, this);
3149 return;
3150 }
3151 }
3152 }
3153 }
3154
3156 {
3157 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3158 {
3159 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3160 {
3161 if (item->GetCount() + remcount <= count)
3162 {
3163 // all keys can be unequipped
3164 remcount += item->GetCount();
3166
3167 if (remcount >= count)
3168 return;
3169 }
3170 else
3171 {
3172 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3173 item->SetCount(item->GetCount() - count + remcount);
3174 if (IsInWorld() && update)
3175 item->SendUpdateToPlayer(this);
3176 item->SetState(ITEM_CHANGED, this);
3177 return;
3178 }
3179 }
3180 }
3181 }
3182
3183 // in inventory bags
3185 {
3186 if (Bag* bag = GetBagByPos(i))
3187 {
3188 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3189 {
3190 if (Item* item = bag->GetItemByPos(j))
3191 {
3192 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3193 {
3194 // all items in bags can be unequipped
3195 if (item->GetCount() + remcount <= count)
3196 {
3197 remcount += item->GetCount();
3198 DestroyItem(i, j, update);
3199
3200 if (remcount >= count)
3201 return;
3202 }
3203 else
3204 {
3205 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3206 item->SetCount(item->GetCount() - count + remcount);
3207 if (IsInWorld() && update)
3208 item->SendUpdateToPlayer(this);
3209 item->SetState(ITEM_CHANGED, this);
3210 return;
3211 }
3212 }
3213 }
3214 }
3215 }
3216 }
3217
3218 // in equipment and bag list
3220 {
3221 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3222 {
3223 if (item && item->GetEntry() == itemEntry && !item->IsInTrade())
3224 {
3225 if (item->GetCount() + remcount <= count)
3226 {
3227 if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i, false) == EQUIP_ERR_OK)
3228 {
3229 remcount += item->GetCount();
3231
3232 if (remcount >= count)
3233 return;
3234 }
3235 }
3236 else
3237 {
3238 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3239 item->SetCount(item->GetCount() - count + remcount);
3240 if (IsInWorld() && update)
3241 item->SendUpdateToPlayer(this);
3242 item->SetState(ITEM_CHANGED, this);
3243 return;
3244 }
3245 }
3246 }
3247 }
3248
3249 // in bank
3251 {
3252 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3253 {
3254 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3255 {
3256 if (item->GetCount() + remcount <= count)
3257 {
3258 remcount += item->GetCount();
3260 if (remcount >= count)
3261 return;
3262 }
3263 else
3264 {
3265 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3266 item->SetCount(item->GetCount() - count + remcount);
3267 if (IsInWorld() && update)
3268 item->SendUpdateToPlayer(this);
3269 item->SetState(ITEM_CHANGED, this);
3270 return;
3271 }
3272 }
3273 }
3274 }
3275
3276 // in bank bags
3277 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
3278 {
3279 if (Bag* bag = GetBagByPos(i))
3280 {
3281 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3282 {
3283 if (Item* item = bag->GetItemByPos(j))
3284 {
3285 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3286 {
3287 // all items in bags can be unequipped
3288 if (item->GetCount() + remcount <= count)
3289 {
3290 remcount += item->GetCount();
3291 DestroyItem(i, j, update);
3292
3293 if (remcount >= count)
3294 return;
3295 }
3296 else
3297 {
3298 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3299 item->SetCount(item->GetCount() - count + remcount);
3300 if (IsInWorld() && update)
3301 item->SendUpdateToPlayer(this);
3302 item->SetState(ITEM_CHANGED, this);
3303 return;
3304 }
3305 }
3306 }
3307 }
3308 }
3309 }
3310}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanUnequipItem(), CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by _StoreOrEquipNewItem(), AbandonQuest(), WorldSession::DoLootRelease(), Spell::EffectCreateItem2(), Spell::EffectEnchantItemPerm(), Spell::EffectFeedPet(), Spell::EffectScriptEffect(), FailQuest(), go_ahune_ice_stone::GossipSelect(), misc_commandscript::HandleAddItemCommand(), spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), WorldSession::HandleDestroyItemOpcode(), spell_item_massive_seaforium_charge::HandleItemRemove(), WorldSession::HandleWrapItemOpcode(), npc_brewfest_keg_reciver::MoveInLineOfSight(), at_hor_battered_hilt_throw::OnTrigger(), npc_oculus_drakegiver::RemoveEssence(), spell_najentus_remove_spines::RemoveSpines(), RewardQuest(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Spell::TakeAmmo(), Spell::TakeCastItem(), TakeQuestSourceItem(), and Spell::TakeReagents().

◆ DestroyZoneLimitedItem()

void Player::DestroyZoneLimitedItem ( bool  update,
uint32  new_zone 
)
3313{
3314 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3315
3316 // in inventory
3318 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3319 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3321
3323 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3324 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3326
3327 // in inventory bags
3329 if (Bag* pBag = GetBagByPos(i))
3330 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3331 if (Item* pItem = pBag->GetItemByPos(j))
3332 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3333 DestroyItem(i, j, update);
3334
3335 // in equipment and bag list
3337 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3338 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3340}

References CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), WorldLocation::GetMapId(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by UpdateZone().

◆ DoRandomRoll()

uint32 Player::DoRandomRoll ( uint32  minimum,
uint32  maximum 
)
16214{
16215 ASSERT(minimum <= maximum);
16216
16217 uint32 roll = urand(minimum, maximum);
16218
16220 randomRoll.Min = minimum;
16221 randomRoll.Max = maximum;
16222 randomRoll.Result = roll;
16223 randomRoll.Roller = GetGUID();
16224 if (Group* group = GetGroup())
16225 group->BroadcastPacket(randomRoll.Write(), false);
16226 else
16227 SendDirectMessage(randomRoll.Write());
16228
16229 return roll;
16230}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
Definition MiscPackets.h:108
uint32 Max
Definition MiscPackets.h:115
uint32 Result
Definition MiscPackets.h:116
WorldPacket const * Write() override
Definition MiscPackets.cpp:76
uint32 Min
Definition MiscPackets.h:114
ObjectGuid Roller
Definition MiscPackets.h:117

References ASSERT, GetGroup(), Object::GetGUID(), WorldPackets::Misc::RandomRoll::Max, WorldPackets::Misc::RandomRoll::Min, WorldPackets::Misc::RandomRoll::Result, WorldPackets::Misc::RandomRoll::Roller, SendDirectMessage(), urand(), and WorldPackets::Misc::RandomRoll::Write().

Referenced by WorldSession::HandleRandomRollOpcode(), and spell_item_worn_troll_dice::HandleScript().

◆ DropModCharge()

void Player::DropModCharge ( SpellModifier mod,
Spell spell 
)
10104{
10105 if (spell && mod->ownerAura && mod->charges > 0)
10106 {
10107 if (--mod->charges == 0)
10108 mod->charges = -1;
10109
10110 spell->m_appliedMods.insert(mod->ownerAura);
10111 }
10112}
UsedSpellMods m_appliedMods
Definition Spell.h:548
int16 charges
Definition Player.h:185

References SpellModifier::charges, Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ DuelComplete()

void Player::DuelComplete ( DuelCompleteType  type)
6445{
6446 // duel not requested
6447 if (!duel)
6448 return;
6449
6450 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6451 if (duel->State == DUEL_STATE_COMPLETED)
6452 return;
6453
6454 Player* opponent = duel->Opponent;
6455 duel->State = DUEL_STATE_COMPLETED;
6456 opponent->duel->State = DUEL_STATE_COMPLETED;
6457
6458 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6459
6461 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6462 SendDirectMessage(&data);
6463 if (opponent->GetSession())
6464 {
6465 opponent->SendDirectMessage(&data);
6466 }
6467
6468 if (type != DUEL_INTERRUPTED)
6469 {
6470 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6471 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6472 data << opponent->GetName();
6473 data << GetName();
6474 SendMessageToSet(&data, true);
6475 }
6476
6477 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6478
6479 switch (type)
6480 {
6481 case DUEL_FLED:
6482 // if initiator and opponent are on the same team
6483 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6484 if (GetTeamId() == opponent->GetTeamId())
6485 {
6486 AttackStop();
6487 opponent->AttackStop();
6488 }
6489 else
6490 {
6491 if (!IsPvP())
6492 {
6493 AttackStop();
6494 }
6495 if (!opponent->IsPvP())
6496 {
6497 opponent->AttackStop();
6498 }
6499 }
6500 break;
6501 case DUEL_WON:
6504
6505 // Credit for quest Death's Challenge
6507 {
6508 opponent->CastSpell(opponent, 52994, true);
6509 }
6510
6511 // Honor points after duel (the winner) - ImpConfig
6512 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6513 {
6514 opponent->RewardHonor(nullptr, 1, amount);
6515 }
6516
6517 break;
6518 default:
6519 break;
6520 }
6521
6522 // Victory emote spell
6523 if (type != DUEL_INTERRUPTED)
6524 {
6525 opponent->CastSpell(opponent, 52852, true);
6526 }
6527
6528 // Remove Duel Flag object
6530 if (obj)
6531 {
6532 duel->Initiator->RemoveGameObject(obj, true);
6533 }
6534
6535 /* remove auras */
6536 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6537 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6538 {
6539 Aura const* aura = i->second->GetBase();
6540 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6541 {
6542 opponent->RemoveAura(i);
6543 }
6544 else
6545 {
6546 ++i;
6547 }
6548 }
6549
6551 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6552 {
6553 Aura const* aura = i->second->GetBase();
6554 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6555 RemoveAura(i);
6556 else
6557 ++i;
6558 }
6559
6560 // cleanup combo points
6561 if (GetComboTarget() == duel->Opponent)
6562 {
6564 }
6565 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6566 {
6568 }
6569
6570 if (duel->Opponent->GetComboTarget() == this)
6571 {
6572 duel->Opponent->ClearComboPoints();
6573 }
6574 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6575 {
6576 duel->Opponent->ClearComboPoints();
6577 }
6578
6579 //cleanups
6583 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6584
6585 opponent->duel.reset(nullptr);
6586 duel.reset(nullptr);
6587}
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition DBCEnums.h:187
@ CONFIG_HONOR_AFTER_DUEL
Definition IWorld.h:334
@ DUEL_STATE_COMPLETED
Definition Player.h:378
@ DUEL_WON
Definition SharedDefines.h:3613
@ CLASS_CONTEXT_QUEST
Definition UnitDefines.h:229
@ PLAYER_DUEL_TEAM
Definition UpdateFields.h:184
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
time_t GetApplyTime() const
Definition SpellAuras.h:128
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition Player.cpp:6098
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5690
bool IsPvP()
Definition Player.cpp:16265
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:645
void ClearComboPoints()
Definition Unit.cpp:16930
Unit * GetComboTarget() const
Definition Unit.h:969
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10462
ObjectGuid const GetComboTargetGUID() const
Definition Unit.h:970
ObjectGuid GetPetGUID() const
Definition Unit.h:694
@ SMSG_DUEL_WINNER
Definition Opcodes.h:393
@ SMSG_DUEL_COMPLETE
Definition Opcodes.h:392

References ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, Unit::AttackStop(), Unit::CastSpell(), CLASS_CONTEXT_QUEST, CLASS_DEATH_KNIGHT, Unit::ClearComboPoints(), CONFIG_HONOR_AFTER_DUEL, duel, DUEL_FLED, DUEL_INTERRUPTED, DUEL_STATE_COMPLETED, DUEL_WON, ObjectGuid::Empty, Unit::GetAppliedAuras(), Aura::GetApplyTime(), Aura::GetCasterGUID(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsClass(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Unit::SetUInt32Value(), SMSG_DUEL_COMPLETE, SMSG_DUEL_WINNER, sScriptMgr, sWorld, ObjectGuid::ToString(), Position::ToString(), and UpdateAchievementCriteria().

Referenced by Unit::_ExitVehicle(), CheckDuelDistance(), CleanupsBeforeDelete(), Unit::DealDamage(), WorldSession::HandleDuelCancelledOpcode(), and TeleportTo().

◆ DurabilityLoss()

void Player::DurabilityLoss ( Item item,
double  percent 
)
4765{
4766 if (!item || percent == 0.0)
4767 return;
4768
4769 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4770
4771 if (!pMaxDurability)
4772 return;
4773
4774 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4775
4776 if (pDurabilityLoss < 1)
4777 pDurabilityLoss = 1;
4778
4779 DurabilityPointsLoss(item, pDurabilityLoss);
4780}
@ ITEM_FIELD_MAXDURABILITY
Definition UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition Player.cpp:4808

References DurabilityPointsLoss(), Object::GetUInt32Value(), and ITEM_FIELD_MAXDURABILITY.

Referenced by DurabilityLossAll(), Spell::EffectDurabilityDamagePCT(), and Spell::EffectSummonChangeItem().

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4739{
4741 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4742 DurabilityLoss(pItem, percent);
4743
4744 if (inventory)
4745 {
4746 // bags not have durability
4747 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4748
4750 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4751 DurabilityLoss(pItem, percent);
4752
4753 // keys not have durability
4754 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4755
4757 if (Bag* pBag = GetBagByPos(i))
4758 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4759 if (Item* pItem = GetItemByPos(i, j))
4760 DurabilityLoss(pItem, percent);
4761 }
4762}
void DurabilityLoss(Item *item, double percent)
Definition Player.cpp:4764

References DurabilityLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamagePCT(), EnvironmentalDamage(), and WorldSession::SendSpiritResurrect().

◆ DurabilityPointLossForEquipSlot()

void Player::DurabilityPointLossForEquipSlot ( EquipmentSlots  slot)
4839{
4840 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4841 DurabilityPointsLoss(pItem, 1);
4842}

References DurabilityPointsLoss(), GetItemByPos(), and INVENTORY_SLOT_BAG_0.

Referenced by Unit::DealDamage(), and Spell::TakeAmmo().

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4809{
4811 return;
4812
4813 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4814 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4815 int32 pNewDurability = pOldDurability - points;
4816
4817 if (pNewDurability < 0)
4818 pNewDurability = 0;
4819 else if (pNewDurability > pMaxDurability)
4820 pNewDurability = pMaxDurability;
4821
4822 if (pOldDurability != pNewDurability)
4823 {
4824 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4825 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4826 _ApplyItemMods(item, item->GetSlot(), false);
4827
4828 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4829
4830 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4831 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4832 _ApplyItemMods(item, item->GetSlot(), true);
4833
4834 item->SetState(ITEM_CHANGED, this);
4835 }
4836}
@ ITEM_FIELD_DURABILITY
Definition UpdateFields.h:69
bool HasPreventDurabilityLossAura() const
Definition Unit.h:1720

References _ApplyItemMods(), Item::GetSlot(), Object::GetUInt32Value(), Unit::HasPreventDurabilityLossAura(), Item::IsEquipped(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, Item::SetState(), and Object::SetUInt32Value().

Referenced by DurabilityLoss(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), and Spell::EffectDurabilityDamage().

◆ DurabilityPointsLossAll()

void Player::DurabilityPointsLossAll ( int32  points,
bool  inventory 
)
4783{
4785 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4786 DurabilityPointsLoss(pItem, points);
4787
4788 if (inventory)
4789 {
4790 // bags not have durability
4791 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4792
4794 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4795 DurabilityPointsLoss(pItem, points);
4796
4797 // keys not have durability
4798 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4799
4801 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4802 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4803 if (Item* pItem = GetItemByPos(i, j))
4804 DurabilityPointsLoss(pItem, points);
4805 }
4806}

References DurabilityPointsLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamage().

◆ DurabilityRepair()

uint32 Player::DurabilityRepair ( uint16  pos,
bool  cost,
float  discountMod,
bool  guildBank 
)
4861{
4862 Item* item = GetItemByPos(pos);
4863
4864 uint32 TotalCost = 0;
4865 if (!item)
4866 return TotalCost;
4867
4868 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4869 if (!maxDurability)
4870 return TotalCost;
4871
4872 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4873
4874 if (cost)
4875 {
4876 uint32 LostDurability = maxDurability - curDurability;
4877 if (LostDurability > 0)
4878 {
4879 ItemTemplate const* ditemProto = item->GetTemplate();
4880
4881 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4882 if (!dcost)
4883 {
4884 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4885 return TotalCost;
4886 }
4887
4888 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4889 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4890 if (!dQualitymodEntry)
4891 {
4892 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4893 return TotalCost;
4894 }
4895
4896 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4897 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4898
4899 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4900
4901 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4902 costs = 1;
4903
4904 if (guildBank)
4905 {
4906 if (GetGuildId() == 0)
4907 {
4908 // LOG_DEBUG("entities.player", "You are not member of a guild");
4909 return TotalCost;
4910 }
4911
4912 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4913 if (!guild)
4914 return TotalCost;
4915
4916 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4917 return TotalCost;
4918
4919 TotalCost = costs;
4920 }
4921 else if (!HasEnoughMoney(costs))
4922 {
4923 // LOG_DEBUG("entities.player", "You do not have enough money");
4924 return TotalCost;
4925 }
4926 else
4927 ModifyMoney(-int32(costs));
4928 }
4929 }
4930
4931 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4932 item->SetState(ITEM_CHANGED, this);
4933
4934 // reapply mods for total broken and repaired item if equipped
4935 if (IsEquipmentPos(pos) && !curDurability)
4936 _ApplyItemMods(item, pos & 255, true);
4937 return TotalCost;
4938}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
@ RATE_REPAIRCOST
Definition IWorld.h:481
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition ItemTemplate.h:557
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition Guild.cpp:1691
Definition DBCStructure.h:877
uint32 multiplier[29]
Definition DBCStructure.h:879
Definition DBCStructure.h:883
float quality_mod
Definition DBCStructure.h:885
uint32 ItemLevel
Definition ItemTemplate.h:635

References _ApplyItemMods(), ItemTemplate::Class, GetGuildId(), GetItemByPos(), GetSession(), Item::GetTemplate(), Object::GetUInt32Value(), Guild::HandleMemberWithdrawMoney(), HasEnoughMoney(), IsEquipmentPos(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, ItemTemplate::ItemLevel, ItemSubClassToDurabilityMultiplierId(), LOG_ERROR, ModifyMoney(), DurabilityCostsEntry::multiplier, ItemTemplate::Quality, DurabilityQualityEntry::quality_mod, RATE_REPAIRCOST, sDurabilityCostsStore, sDurabilityQualityStore, Item::SetState(), Object::SetUInt32Value(), sGuildMgr, ItemTemplate::SubClass, and sWorld.

Referenced by DurabilityRepairAll(), and WorldSession::HandleRepairItemOpcode().

◆ DurabilityRepairAll()

uint32 Player::DurabilityRepairAll ( bool  cost,
float  discountMod,
bool  guildBank 
)
4845{
4846 uint32 TotalCost = 0;
4847 // equipped, backpack, bags itself
4849 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4850
4851 // bank, buyback and keys not repaired
4852
4853 // items in inventory bags
4855 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4856 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4857 return TotalCost;
4858}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition Player.cpp:4860

References DurabilityRepair(), EQUIPMENT_SLOT_START, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and MAX_BAG_SIZE.

Referenced by WorldSession::HandleRepairItemOpcode().

◆ EnchantmentFitsRequirements()

bool Player::EnchantmentFitsRequirements ( uint32  enchantmentcondition,
int8  slot 
)
11160{
11161 if (!enchantmentcondition)
11162 return true;
11163
11164 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11165
11166 if (!Condition)
11167 return true;
11168
11169 uint8 curcount[4] = {0, 0, 0, 0};
11170
11171 //counting current equipped gem colors
11173 {
11174 if (i == slot)
11175 continue;
11177 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11178 {
11179 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11180 {
11181 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11182 continue;
11183
11184 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11185 if (!enchant_id)
11186 continue;
11187
11188 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11189 if (!enchantEntry)
11190 continue;
11191
11192 uint32 gemid = enchantEntry->GemID;
11193 if (!gemid)
11194 continue;
11195
11196 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11197 if (!gemProto)
11198 continue;
11199
11200 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11201 if (!gemProperty)
11202 continue;
11203
11204 uint8 GemColor = gemProperty->color;
11205
11206 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11207 {
11208 if (tmpcolormask & GemColor)
11209 ++curcount[b];
11210 }
11211 }
11212 }
11213 }
11214
11215 bool activate = true;
11216
11217 for (uint8 i = 0; i < 5; i++)
11218 {
11219 if (!Condition->Color[i])
11220 continue;
11221
11222 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11223
11224 // if have <CompareColor> use them as count, else use <value> from Condition
11225 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11226
11227 switch (Condition->Comparator[i])
11228 {
11229 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11230 activate &= (_cur_gem < _cmp_gem);
11231 break;
11232 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11233 activate &= (_cur_gem > _cmp_gem);
11234 break;
11235 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11236 activate &= (_cur_gem >= _cmp_gem);
11237 break;
11238 }
11239 }
11240
11241 LOG_DEBUG("entities.player.items", "Checking Condition {}, there are {} Meta Gems, {} Red Gems, {} Yellow Gems and {} Blue Gems, Activate:{}", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no");
11242
11243 return activate;
11244}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition Item.h:174
Definition ConditionMgr.h:195
Definition DBCStructure.h:1013
uint32 color
Definition DBCStructure.h:1016
uint32 GemProperties
Definition ItemTemplate.h:683
Definition DBCStructure.h:1859

References BONUS_ENCHANTMENT_SLOT, GemPropertiesEntry::color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, SpellItemEnchantmentEntry::GemID, ItemTemplate::GemProperties, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), LOG_DEBUG, PRISMATIC_ENCHANTMENT_SLOT, sGemPropertiesStore, sObjectMgr, SOCK_ENCHANTMENT_SLOT, sSpellItemEnchantmentConditionStore, and sSpellItemEnchantmentStore.

Referenced by ApplyEnchantment(), and CorrectMetaGemEnchants().

◆ EnvironmentalDamage()

uint32 Player::EnvironmentalDamage ( EnviromentalDamage  type,
uint32  damage 
)
756{
758 return 0;
759
760 // Absorb, resist some environmental damage type
761 uint32 absorb = 0;
762 uint32 resist = 0;
763
764 switch (type)
765 {
766 case DAMAGE_LAVA:
767 case DAMAGE_SLIME:
768 {
769 DamageInfo dmgInfo(this, this, damage, nullptr, type == DAMAGE_LAVA ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE);
770 Unit::CalcAbsorbResist(dmgInfo);
771 absorb = dmgInfo.GetAbsorb();
772 resist = dmgInfo.GetResist();
773 damage = dmgInfo.GetDamage();
774 }
775 default:
776 break;
777 }
778
779 Unit::DealDamageMods(this, damage, &absorb);
780
782 packet.Victim = GetGUID();
783 packet.Type = type != DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL;
784 packet.Amount = damage;
785 packet.Absorbed = absorb;
786 packet.Resisted = resist;
787 SendMessageToSet(packet.Write(), true);
788
789 uint32 final_damage = Unit::DealDamage(this, this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
790
791 if (!IsAlive())
792 {
793 if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
794 {
795 LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
798 // durability lost message
800 }
801
803 }
804
805 return final_damage;
806}
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition DBCEnums.h:140
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition IWorld.h:516
@ DAMAGE_SLIME
Definition Player.h:843
@ DAMAGE_FALL
Definition Player.h:841
@ DAMAGE_LAVA
Definition Player.h:842
@ DAMAGE_FALL_TO_VOID
Definition Player.h:845
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:299
@ SELF_DAMAGE
Definition Unit.h:253
@ DIRECT_DAMAGE
Definition Unit.h:248
Definition Unit.h:330
uint32 GetResist() const
Definition Unit.h:366
uint32 GetDamage() const
Definition Unit.h:364
uint32 GetAbsorb() const
Definition Unit.h:365
void DurabilityLossAll(double percent, bool inventory)
Definition Player.cpp:4738
void SendDurabilityLoss()
Definition Player.cpp:4733
bool IsImmuneToEnvironmentalDamage()
Definition Player.cpp:749
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2158
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:800
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:810
Definition CombatLogPackets.h:29
ObjectGuid Victim
Definition CombatLogPackets.h:35
uint32 Amount
Definition CombatLogPackets.h:37
uint32 Absorbed
Definition CombatLogPackets.h:39
EnviromentalDamage Type
Definition CombatLogPackets.h:36
uint32 Resisted
Definition CombatLogPackets.h:38
WorldPacket const * Write() override
Definition CombatLogPackets.cpp:20

References WorldPackets::CombatLog::EnvironmentalDamageLog::Absorbed, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, WorldPackets::CombatLog::EnvironmentalDamageLog::Amount, Unit::CalcAbsorbResist(), DAMAGE_FALL, DAMAGE_FALL_TO_VOID, DAMAGE_LAVA, DAMAGE_SLIME, Unit::DealDamage(), Unit::DealDamageMods(), DIRECT_DAMAGE, DurabilityLossAll(), DamageInfo::GetAbsorb(), DamageInfo::GetDamage(), Object::GetGUID(), WorldObject::GetName(), DamageInfo::GetResist(), Unit::IsAlive(), IsImmuneToEnvironmentalDamage(), LOG_DEBUG, RATE_DURABILITY_LOSS_ON_DEATH, WorldPackets::CombatLog::EnvironmentalDamageLog::Resisted, SELF_DAMAGE, SendDurabilityLoss(), SendMessageToSet(), SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, sWorld, Position::ToString(), WorldPackets::CombatLog::EnvironmentalDamageLog::Type, UpdateAchievementCriteria(), WorldPackets::CombatLog::EnvironmentalDamageLog::Victim, and WorldPackets::CombatLog::EnvironmentalDamageLog::Write().

Referenced by Spell::EffectEnvironmentalDMG(), HandleDrowning(), HandleFall(), and WorldSession::HandleMovementOpcodes().

◆ EquipItem()

Item * Player::EquipItem ( uint16  pos,
Item pItem,
bool  update 
)
2728{
2730 AddItemDurations(pItem);
2731
2732 uint8 bag = pos >> 8;
2733 uint8 slot = pos & 255;
2734
2735 Item* pItem2 = GetItemByPos(bag, slot);
2736
2737 if (!pItem2)
2738 {
2739 VisualizeItem(slot, pItem);
2740
2741 if (IsAlive())
2742 {
2743 ItemTemplate const* pProto = pItem->GetTemplate();
2744
2745 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2746 if (pProto && pProto->ItemSet)
2747 AddItemsSetItem(this, pItem);
2748
2749 _ApplyItemMods(pItem, slot, true);
2750
2751 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2752 {
2753 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
2754 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2755
2756 if (!spellProto)
2757 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2758 else
2759 {
2761
2763
2764 WorldPacket data;
2766 GetSession()->SendPacket(&data);
2767 }
2768 }
2769 }
2770
2771 if (IsInWorld() && update)
2772 {
2773 pItem->AddToWorld();
2774 pItem->SendUpdateToPlayer(this);
2775 }
2776
2777 ApplyEquipCooldown(pItem);
2778
2779 // update expertise and armor penetration - passive auras may need it
2780
2781 if (slot == EQUIPMENT_SLOT_MAINHAND)
2783
2784 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2786
2787 switch (slot)
2788 {
2793 default:
2794 break;
2795 }
2796 }
2797 else
2798 {
2799 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2800 if (IsInWorld() && update)
2801 pItem2->SendUpdateToPlayer(this);
2802
2803 // delete item (it not in any slot currently)
2804 //pItem->DeleteFromDB();
2805 if (IsInWorld() && update)
2806 {
2807 pItem->RemoveFromWorld();
2808 pItem->DestroyForPlayer(this);
2809 }
2810
2812 RemoveItemDurations(pItem);
2813
2814 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2815 pItem->SetNotRefundable(this);
2816 pItem->ClearSoulboundTradeable(this);
2817 RemoveTradeableItem(pItem);
2818 pItem->SetState(ITEM_REMOVED, this);
2819 pItem2->SetState(ITEM_CHANGED, this);
2820
2821 ApplyEquipCooldown(pItem2);
2822 sScriptMgr->OnEquip(this, pItem2, bag, slot, update);
2823 return pItem2;
2824 }
2825
2826 // only for full equip instead adding to stack
2829
2830 sScriptMgr->OnEquip(this, pItem, bag, slot, update);
2832 return pItem;
2833}
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition DBCEnums.h:163
@ CLASS_CONTEXT_WEAPON_SWAP
Definition UnitDefines.h:241
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition Unit.h:623
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition CharmInfo.cpp:419
void UpdateForQuestWorldObjects()
Definition PlayerUpdates.cpp:1784
void ApplyEquipCooldown(Item *pItem)
Definition Player.cpp:11808
void VisualizeItem(uint8 slot, Item *pItem)
Definition PlayerStorage.cpp:2875
uint32 StartRecoveryTime
Definition SpellInfo.h:351

References _ApplyItemMods(), ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), GlobalCooldownMgr::AddGlobalCooldown(), AddItemDurations(), AddItemsSetItem(), Object::AddToWorld(), ApplyEquipCooldown(), BASE_ATTACK, Unit::BuildCooldownPacket(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), GetSession(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), IsClass(), Unit::IsInCombat(), Object::IsInWorld(), ITEM_CHANGED, ITEM_CLASS_WEAPON, ITEM_REMOVED, ItemTemplate::ItemSet, LOG_ERROR, m_weaponChangeTimer, OFF_ATTACK, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), WorldSession::SendPacket(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetState(), SPELL_COOLDOWN_FLAG_INCLUDE_GCD, sScriptMgr, sSpellMgr, SpellInfo::StartRecoveryTime, UpdateAchievementCriteria(), UpdateExpertise(), UpdateForQuestWorldObjects(), and VisualizeItem().

Referenced by Create(), Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoEquipItemOpcode(), SplitItem(), and SwapItem().

◆ EquipNewItem()

Item * Player::EquipNewItem ( uint16  pos,
uint32  item,
bool  update 
)
2708{
2709 Item* _item = Item::CreateItem(item, 1, this);
2710 if (!_item)
2711 return nullptr;
2712
2713 if (!IsEquipmentPos(pos) || sScriptMgr->CanSaveEquipNewItem(this, _item, pos, update))
2714 {
2715 // pussywizard: obtaining blue or better items saves to db
2716 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2717 if (pProto->Quality >= ITEM_QUALITY_RARE)
2719
2720 ItemAddedQuestCheck(item, 1);
2722 }
2723
2724 return EquipItem(pos, _item, update);
2725}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition DBCEnums.h:199
@ ITEM_QUALITY_RARE
Definition SharedDefines.h:332
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition PlayerQuest.cpp:1835

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), Item::CreateItem(), EquipItem(), IsEquipmentPos(), ITEM_QUALITY_RARE, ItemAddedQuestCheck(), sObjectMgr, sScriptMgr, and UpdateAchievementCriteria().

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ ExecuteOrCancelSpellCastRequest()

void Player::ExecuteOrCancelSpellCastRequest ( PendingSpellCastRequest castRequest,
bool  isCancel = false 
)
2355{
2356 if (isCancel)
2357 request->cancelInProgress = true;
2358
2359 if (WorldSession* session = GetSession())
2360 {
2361 if (request->isItem)
2362 session->HandleUseItemOpcode(request->requestPacket);
2363 else
2364 session->HandleCastSpellOpcode(request->requestPacket);
2365 }
2366}

References PendingSpellCastRequest::cancelInProgress, GetSession(), PendingSpellCastRequest::isItem, and PendingSpellCastRequest::requestPacket.

Referenced by ProcessSpellQueue().

◆ FailQuest()

void Player::FailQuest ( uint32  quest_id)
887{
888 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
889 {
890 QuestStatus qStatus = GetQuestStatus(questId);
891 // xinef: if quest is marked as failed, dont do it again
892 if ((qStatus != QUEST_STATUS_INCOMPLETE) && (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE)))
893 return;
894
896
897 uint16 log_slot = FindQuestSlot(questId);
898
899 if (log_slot < MAX_QUEST_LOG_SIZE)
900 {
901 SetQuestSlotTimer(log_slot, 1);
903 }
904
905 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
906 {
907 QuestStatusData& q_status = m_QuestStatus[questId];
908
909 RemoveTimedQuest(questId);
910 q_status.Timer = 0;
911
912 SendQuestTimerFailed(questId);
913 }
914 else
915 SendQuestFailed(questId);
916
917 // Destroy quest items on quest failure.
918 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
919 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
920 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
921 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
922
923 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
924 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
925 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
926 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
927 }
928}
@ QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE
Definition QuestDef.h:167
void SendQuestTimerFailed(uint32 quest_id)
Definition PlayerQuest.cpp:2394
void SendQuestFailed(uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
Definition PlayerQuest.cpp:2382
void SetQuestSlotTimer(uint16 slot, uint32 timer)
Definition Player.h:1515
void RemoveTimedQuest(uint32 quest_id)
Definition Player.h:1566

References BIND_QUEST_ITEM, DestroyItemCount(), FindQuestSlot(), GetQuestStatus(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_FAIL, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, RemoveTimedQuest(), SendQuestFailed(), SendQuestTimerFailed(), SetQuestSlotState(), SetQuestSlotTimer(), SetQuestStatus(), sObjectMgr, and QuestStatusData::Timer.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), SmartAI::EndPath(), dragonmaw_race_npc::FailQuest(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_captain_saeed::npc_captain_saeedAI::JustDied(), npc_doctor::npc_doctorAI::PatientDied(), Map::ScriptsProcess(), Update(), and npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI().

◆ FindEquipSlot()

uint8 Player::FindEquipSlot ( ItemTemplate const *  proto,
uint32  slot,
bool  swap 
) const
126{
127 uint8 slots[4];
128 slots[0] = NULL_SLOT;
129 slots[1] = NULL_SLOT;
130 slots[2] = NULL_SLOT;
131 slots[3] = NULL_SLOT;
132 switch (proto->InventoryType)
133 {
134 case INVTYPE_HEAD:
135 slots[0] = EQUIPMENT_SLOT_HEAD;
136 break;
137 case INVTYPE_NECK:
138 slots[0] = EQUIPMENT_SLOT_NECK;
139 break;
141 slots[0] = EQUIPMENT_SLOT_SHOULDERS;
142 break;
143 case INVTYPE_BODY:
144 slots[0] = EQUIPMENT_SLOT_BODY;
145 break;
146 case INVTYPE_CHEST:
147 case INVTYPE_ROBE:
148 slots[0] = EQUIPMENT_SLOT_CHEST;
149 break;
150 case INVTYPE_WAIST:
151 slots[0] = EQUIPMENT_SLOT_WAIST;
152 break;
153 case INVTYPE_LEGS:
154 slots[0] = EQUIPMENT_SLOT_LEGS;
155 break;
156 case INVTYPE_FEET:
157 slots[0] = EQUIPMENT_SLOT_FEET;
158 break;
159 case INVTYPE_WRISTS:
160 slots[0] = EQUIPMENT_SLOT_WRISTS;
161 break;
162 case INVTYPE_HANDS:
163 slots[0] = EQUIPMENT_SLOT_HANDS;
164 break;
165 case INVTYPE_FINGER:
166 slots[0] = EQUIPMENT_SLOT_FINGER1;
167 slots[1] = EQUIPMENT_SLOT_FINGER2;
168 break;
169 case INVTYPE_TRINKET:
170 slots[0] = EQUIPMENT_SLOT_TRINKET1;
171 slots[1] = EQUIPMENT_SLOT_TRINKET2;
172 break;
173 case INVTYPE_CLOAK:
174 slots[0] = EQUIPMENT_SLOT_BACK;
175 break;
176 case INVTYPE_WEAPON:
177 {
178 slots[0] = EQUIPMENT_SLOT_MAINHAND;
179
180 // suggest offhand slot only if know dual wielding
181 // (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
182 if (CanDualWield())
183 slots[1] = EQUIPMENT_SLOT_OFFHAND;
184 break;
185 }
186 case INVTYPE_SHIELD:
188 case INVTYPE_HOLDABLE:
189 slots[0] = EQUIPMENT_SLOT_OFFHAND;
190 break;
191 case INVTYPE_RANGED:
193 case INVTYPE_THROWN:
194 slots[0] = EQUIPMENT_SLOT_RANGED;
195 break;
196 case INVTYPE_2HWEAPON:
197 slots[0] = EQUIPMENT_SLOT_MAINHAND;
198 if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && proto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
200 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
201 if (mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
202 slots[1] = EQUIPMENT_SLOT_OFFHAND;
203 break;
204 case INVTYPE_TABARD:
205 slots[0] = EQUIPMENT_SLOT_TABARD;
206 break;
208 slots[0] = EQUIPMENT_SLOT_MAINHAND;
209 break;
210 case INVTYPE_BAG:
211 slots[0] = INVENTORY_SLOT_BAG_START + 0;
212 slots[1] = INVENTORY_SLOT_BAG_START + 1;
213 slots[2] = INVENTORY_SLOT_BAG_START + 2;
214 slots[3] = INVENTORY_SLOT_BAG_START + 3;
215 break;
216 case INVTYPE_RELIC:
217 {
218 switch (proto->SubClass)
219 {
222 slots[0] = EQUIPMENT_SLOT_RANGED;
223 break;
226 slots[0] = EQUIPMENT_SLOT_RANGED;
227 break;
230 slots[0] = EQUIPMENT_SLOT_RANGED;
231 break;
234 slots[0] = EQUIPMENT_SLOT_RANGED;
235 break;
238 slots[0] = EQUIPMENT_SLOT_RANGED;
239 break;
240 }
241 break;
242 }
243 default:
244 return NULL_SLOT;
245 }
246
247 if (slot != NULL_SLOT)
248 {
249 if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
250 for (uint8 i = 0; i < 4; ++i)
251 if (slots[i] == slot)
252 return slot;
253 }
254 else
255 {
256 // search free slot at first
257 for (uint8 i = 0; i < 4; ++i)
258 if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]))
259 // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
260 if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
261 return slots[i];
262
263 // if not found free and can swap return first appropriate from used
264 for (uint8 i = 0; i < 4; ++i)
265 if (slots[i] != NULL_SLOT && swap)
266 return slots[i];
267 }
268
269 // no free position
270 return NULL_SLOT;
271}
@ INVTYPE_BODY
Definition ItemTemplate.h:260
@ INVTYPE_FINGER
Definition ItemTemplate.h:267
@ INVTYPE_HEAD
Definition ItemTemplate.h:257
@ INVTYPE_ROBE
Definition ItemTemplate.h:276
@ INVTYPE_HOLDABLE
Definition ItemTemplate.h:279
@ INVTYPE_TRINKET
Definition ItemTemplate.h:268
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_WAIST
Definition ItemTemplate.h:262
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WRISTS
Definition ItemTemplate.h:265
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_BAG
Definition ItemTemplate.h:274
@ INVTYPE_NECK
Definition ItemTemplate.h:258
@ INVTYPE_SHOULDERS
Definition ItemTemplate.h:259
@ INVTYPE_FEET
Definition ItemTemplate.h:264
@ INVTYPE_SHIELD
Definition ItemTemplate.h:270
@ INVTYPE_TABARD
Definition ItemTemplate.h:275
@ INVTYPE_LEGS
Definition ItemTemplate.h:263
@ INVTYPE_CHEST
Definition ItemTemplate.h:261
@ INVTYPE_HANDS
Definition ItemTemplate.h:266
@ EQUIPMENT_SLOT_SHOULDERS
Definition Player.h:682
@ EQUIPMENT_SLOT_BODY
Definition Player.h:683
@ EQUIPMENT_SLOT_HANDS
Definition Player.h:689
@ EQUIPMENT_SLOT_NECK
Definition Player.h:681
@ EQUIPMENT_SLOT_TABARD
Definition Player.h:698
@ EQUIPMENT_SLOT_HEAD
Definition Player.h:680
@ EQUIPMENT_SLOT_LEGS
Definition Player.h:686
@ EQUIPMENT_SLOT_BACK
Definition Player.h:694
@ EQUIPMENT_SLOT_WAIST
Definition Player.h:685
@ EQUIPMENT_SLOT_FEET
Definition Player.h:687
@ EQUIPMENT_SLOT_CHEST
Definition Player.h:684
@ EQUIPMENT_SLOT_WRISTS
Definition Player.h:688

References Unit::CanDualWield(), CanTitanGrip(), CLASS_CONTEXT_EQUIP_RELIC, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARLOCK, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_NECK, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_WRISTS, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_BAG, INVTYPE_BODY, INVTYPE_CHEST, INVTYPE_CLOAK, INVTYPE_FEET, INVTYPE_FINGER, INVTYPE_HANDS, INVTYPE_HEAD, INVTYPE_HOLDABLE, INVTYPE_LEGS, INVTYPE_NECK, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_RELIC, INVTYPE_ROBE, INVTYPE_SHIELD, INVTYPE_SHOULDERS, INVTYPE_TABARD, INVTYPE_THROWN, INVTYPE_TRINKET, INVTYPE_WAIST, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_WRISTS, IsClass(), IsTwoHandUsed(), ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, NULL_SLOT, and ItemTemplate::SubClass.

Referenced by CanEquipItem(), and WorldSession::HandleAutoEquipItemOpcode().

◆ FindQuestSlot()

uint16 Player::FindQuestSlot ( uint32  quest_id) const

◆ GetAchievementMgr()

AchievementMgr * Player::GetAchievementMgr ( ) const
inline
2544{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5673{
5674 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5675 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5676 return nullptr;
5677
5678 return &buttonItr->second;
5679}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

float Player::GetAmmoDPS ( ) const
inline
1339{ return m_ammoDPS; }

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16239{
16241
16242 sScriptMgr->OnGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16243
16244 return result;
16245}

References ARENA_TEAM_END, ARENA_TEAM_PERSONAL_RATING, Object::GetUInt32Value(), PLAYER_FIELD_ARENA_TEAM_INFO_1_1, and sScriptMgr.

Referenced by GetMaxPersonalArenaRatingRequirement().

◆ GetArenaPoints()

uint32 Player::GetArenaPoints ( ) const
inline

◆ GetArenaTeamId()

◆ GetArenaTeamIdFromDB()

uint32 Player::GetArenaTeamIdFromDB ( ObjectGuid  guid,
uint8  slot 
)
static
6338{
6340 stmt->SetData(0, guid.GetCounter());
6341 stmt->SetData(1, type);
6342 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6343
6344 if (!result)
6345 return 0;
6346
6347 uint32 id = (*result)[0].Get<uint32>();
6348 return id;
6349}
@ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID
Definition CharacterDatabase.h:350

References CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CharacterDatabase, ObjectGuid::GetCounter(), and PreparedStatementBase::SetData().

Referenced by arena_commandscript::HandleArenaCreateCommand().

◆ GetArenaTeamIdInvited()

◆ GetArmorProficiency()

uint32 Player::GetArmorProficiency ( ) const
inline
1372{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target,
bool  force = false 
)

Blizz sends certain movement packets sometimes even before CreateObject These movement packets are usually found in SMSG_COMPRESSED_MOVES

12098{
12099 if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
12100 return;
12101
12105 if (target->HasFeatherFallAura())
12106 target->SendMovementFeatherFall(this);
12107
12108 if (target->HasWaterWalkAura())
12109 target->SendMovementWaterWalking(this);
12110
12111 if (target->HasHoverAura())
12112 target->SendMovementHover(this);
12113
12115 data<< target->GetPackGUID();
12116
12117 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
12118 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
12119 {
12120 AuraApplication* auraApp = itr->second;
12121 auraApp->BuildUpdatePacket(data, false);
12122 }
12123
12124 GetSession()->SendPacket(&data);
12125}
Definition SpellAuras.h:37
void BuildUpdatePacket(ByteBuffer &data, bool remove) const
Definition SpellAuras.cpp:248
bool HasWaterWalkAura() const
Definition Unit.h:1714
bool HasFeatherFallAura() const
Definition Unit.h:1715
void SendMovementHover(Player *sendTo)
Definition Unit.cpp:20767
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:658
void SendMovementWaterWalking(Player *sendTo)
Definition Unit.cpp:20708
bool HasHoverAura() const
Definition Unit.h:1716
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1465
void SendMovementFeatherFall(Player *sendTo)
Definition Unit.cpp:20730
@ SMSG_AURA_UPDATE_ALL
Definition Opcodes.h:1203

References AuraApplication::BuildUpdatePacket(), Object::GetPackGUID(), GetSession(), Unit::GetVisibleAuras(), Unit::HasFeatherFallAura(), Unit::HasHoverAura(), Unit::HasWaterWalkAura(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), WorldSession::SendPacket(), and SMSG_AURA_UPDATE_ALL.

Referenced by GetInitialVisiblePackets(), and Map::SendInitSelf().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15760{
15761 float sum = 0;
15762 uint32 count = 0;
15763 uint8 level = GetLevel();
15764
15766 {
15767 // don't check tabard, ranged, offhand or shirt
15769 continue;
15770
15771 if (m_items[i] && m_items[i]->GetTemplate())
15773
15774 ++count;
15775 }
15776
15777 return std::max<float>(0.0f, sum / (float)count);
15778}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition ItemTemplate.h:759

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, ItemTemplate::GetItemLevelIncludingQuality(), Unit::GetLevel(), Item::GetTemplate(), and m_items.

Referenced by spell_gen_vehicle_scaling_aura::CalculateAmount(), gear_commandscript::HandleGearStatsCommand(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetAverageItemLevelForDF()

float Player::GetAverageItemLevelForDF ( )
15781{
15782 float sum = 0;
15783 uint32 count = 0;
15784 uint8 level = GetLevel();
15785
15786 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15787 {
15788 // don't check tabard, ranged, offhand or shirt
15790 continue;
15791
15792 if (m_items[i] && m_items[i]->GetTemplate())
15793 {
15794 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15795 sum += level * 2.33f;
15796 else
15797 sum += m_items[i]->GetTemplate()->ItemLevel;
15798 }
15799
15800 ++count;
15801 }
15802
15803 return std::max(0.0f, sum / (float)count);
15804}

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, Unit::GetLevel(), Item::GetTemplate(), ITEM_QUALITY_HEIRLOOM, ItemTemplate::ItemLevel, and m_items.

Referenced by lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ GetBagByPos()

◆ GetBankBagSlotCount()

uint8 Player::GetBankBagSlotCount ( ) const
inline

◆ GetBarberShopCost()

uint32 Player::GetBarberShopCost ( uint8  newhairstyle,
uint8  newhaircolor,
uint8  newfacialhair,
BarberShopStyleEntry const *  newSkin = nullptr 
)
13290{
13291 uint8 level = GetLevel();
13292
13293 if (level > GT_MAX_LEVEL)
13294 level = GT_MAX_LEVEL; // max level in this dbc
13295
13296 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13297 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13298 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13299 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13300
13301 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13302 return 0;
13303
13304 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13305
13306 if (!bsc) // shouldn't happen
13307 return 0xFFFFFFFF;
13308
13309 float cost = 0;
13310
13311 if (hairstyle != newhairstyle)
13312 cost += bsc->cost; // full price
13313
13314 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13315 cost += bsc->cost * 0.5f; // +1/2 of price
13316
13317 if (facialhair != newfacialhair)
13318 cost += bsc->cost * 0.75f; // +3/4 of price
13319
13320 if (newSkin && skincolor != newSkin->hair_id)
13321 cost += bsc->cost * 0.75f; // +5/6 of price
13322
13323 return uint32(cost);
13324}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition DBCStructure.h:1035
Definition DBCStructure.h:1041
float cost
Definition DBCStructure.h:1042

References GtBarberShopCostBaseEntry::cost, Object::GetByteValue(), Unit::GetLevel(), GT_MAX_LEVEL, BarberShopStyleEntry::hair_id, PLAYER_BYTES, PLAYER_BYTES_2, and sGtBarberShopCostBaseStore.

Referenced by WorldSession::HandleAlterAppearance().

◆ GetBaseDefenseSkillValue()

uint32 Player::GetBaseDefenseSkillValue ( ) const
inline
@ SKILL_DEFENSE
Definition SharedDefines.h:2881
uint16 GetBaseSkillValue(uint32 skill) const
Definition Player.cpp:5522

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
5080{
5081 if (modGroup >= BASEMOD_END)
5082 {
5083 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
5084 return 0.0f;
5085 }
5086
5087 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5088 return 0.0f;
5089
5090 return m_auraBaseMod[modGroup][modType];
5091}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2514{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition Player.h:413
uint8 BaseRune
Definition Player.h:423
RuneInfo runes[MAX_RUNES]
Definition Player.h:432

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by Spell::EffectActivateRune(), GetRuneBaseCooldown(), IsBaseRuneSlotsOnCooldown(), RemoveRunesByAuraEffect(), RestoreBaseRune(), Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetBaseSkillValue()

uint16 Player::GetBaseSkillValue ( uint32  skill) const
5523{
5524 if (!skill)
5525 return 0;
5526
5527 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5528 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5529 return 0;
5530
5531 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5532 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5533 return result < 0 ? 0 : result;
5534}
#define SKILL_PERM_BONUS(x)
Definition Player.h:87

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_VALUE.

Referenced by npc_engineering_tele_trinket::CanLearn(), GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), GetTrainerSpellState(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), and SatisfyQuestSkill().

◆ GetBaseSpellPowerBonus()

uint32 Player::GetBaseSpellPowerBonus ( )
inline

◆ GetBaseWeaponSkillValue()

uint32 Player::GetBaseWeaponSkillValue ( WeaponAttackType  attType) const
12853{
12854 Item* item = GetWeaponForAttack(attType, true);
12855
12856 // unarmed only with base attack
12857 if (attType != BASE_ATTACK && !item)
12858 return 0;
12859
12860 // weapon skill or (unarmed for base attack)
12861 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12862 return GetBaseSkillValue(skill);
12863}
@ SKILL_UNARMED
Definition SharedDefines.h:2907

References BASE_ATTACK, GetBaseSkillValue(), Item::GetSkill(), GetWeaponForAttack(), and SKILL_UNARMED.

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12234{
12235 if (GetBattlegroundId() == 0)
12236 return nullptr;
12237
12239 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12240}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:186
BattlegroundMap * FindBgMap() const
Definition Battleground.h:450
BattlegroundTypeId GetBattlegroundTypeId() const
Definition Player.h:2263
uint32 GetBattlegroundId() const
Definition Player.h:2262

References Battleground::FindBgMap(), GetBattlegroundId(), GetBattlegroundTypeId(), and sBattlegroundMgr.

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanUnequipItem(), Spell::CheckCast(), MapInstanced::CreateInstanceForPlayer(), Object::DestroyForPlayer(), Spell::EffectOpenLock(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModEffectImmunity(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlegroundPlayerPositionsOpcode(), spell_item_rocket_boots::HandleDummy(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePVPLogDataOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), spell_ioc_gunship_portal::HandleScript2(), InArena(), SpellArea::IsFitToRequirements(), Unit::Kill(), LeaveBattleground(), AchievementCriteriaData::Meets(), Unit::Mount(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_arena_by_type::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_sa_defense_of_the_ancients::OnCheck(), achievement_not_even_a_scratch::OnCheck(), achievement_save_the_day::OnCheck(), go_arena_ready_marker::OnGossipHello(), RepopAtGraveyard(), ReportedAfkBy(), ResurrectPlayer(), RewardHonor(), SendInitWorldStates(), SendLoot(), SummonIfPossible(), AchievementMgr::UpdateAchievementCriteria(), and GameObject::Use().

◆ GetBattlegroundId()

◆ GetBattlegroundQueueIndex()

◆ GetBattlegroundQueueTypeId()

BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId ( uint32  index) const

◆ GetBattlegroundTypeId()

BattlegroundTypeId Player::GetBattlegroundTypeId ( ) const
inline
2263{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition Player.h:1041

References BGData::bgTypeID, and m_bgData.

Referenced by GetBattleground(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12356{
12357 // get a template bg instead of running one
12358 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12359 if (!bgt)
12360 return false;
12361
12362 // limit check leel to dbc compatible level range
12363 uint32 level = GetLevel();
12364 if (level > DEFAULT_MAX_LEVEL)
12365 level = DEFAULT_MAX_LEVEL;
12366
12367 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12368 return false;
12369
12370 return true;
12371}
uint32 GetMaxLevel() const
Definition Battleground.h:339

References DEFAULT_MAX_LEVEL, Unit::GetLevel(), Battleground::GetMaxLevel(), and sBattlegroundMgr.

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), and Creature::isCanInteractWithBattleMaster().

◆ GetBGData()

BGData & Player::GetBGData ( )
inline
2267{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetBonusTalentCount()

uint32 Player::GetBonusTalentCount ( )
inline
1742{ return m_extraBonusTalentCount; };

References m_extraBonusTalentCount.

◆ GetCastRequest()

const PendingSpellCastRequest * Player::GetCastRequest ( uint32  category) const
2322{
2323 for (const PendingSpellCastRequest& request : SpellQueue)
2324 if (request.category == category)
2325 return &request;
2326 return nullptr;
2327}
std::deque< PendingSpellCastRequest > SpellQueue
Definition Player.h:2651
Definition Player.h:1069

References SpellQueue.

Referenced by CanRequestSpellCast().

◆ GetChampioningFaction()

uint32 Player::GetChampioningFaction ( ) const
inline
2558{ return m_ChampioningFaction; }

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1308{
1309 uint8 tag = CHAT_TAG_NONE;
1310
1311 if (isGMChat())
1312 tag |= CHAT_TAG_GM;
1313 if (isDND())
1314 tag |= CHAT_TAG_DND;
1315 if (isAFK())
1316 tag |= CHAT_TAG_AFK;
1317 if (IsCommentator())
1318 tag |= CHAT_TAG_COM;
1319 if (IsDeveloper())
1320 tag |= CHAT_TAG_DEV;
1321
1322 return tag;
1323}
@ CHAT_TAG_COM
Definition Player.h:854
@ CHAT_TAG_DND
Definition Player.h:852
@ CHAT_TAG_DEV
Definition Player.h:855
@ CHAT_TAG_AFK
Definition Player.h:851
@ CHAT_TAG_GM
Definition Player.h:853
@ CHAT_TAG_NONE
Definition Player.h:850
bool IsCommentator() const
Definition Player.h:1169
bool isGMChat() const
Definition Player.h:1177
bool isDND() const
Definition Player.h:1152
bool IsDeveloper() const
Definition Player.h:1171
bool isAFK() const
Definition Player.h:1151

References CHAT_TAG_AFK, CHAT_TAG_COM, CHAT_TAG_DEV, CHAT_TAG_DND, CHAT_TAG_GM, CHAT_TAG_NONE, isAFK(), IsCommentator(), IsDeveloper(), isDND(), and isGMChat().

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1839 {
1840 return m_cinematic;
1841 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12960{
12961 if (pvp)
12962 {
12963 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12964 return copseReclaimDelay[0];
12965 }
12966 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12967 return 0;
12968
12969 time_t now = GameTime::GetGameTime().count();
12970 // 0..2 full period
12971 // should be std::ceil(x)-1 but not floor(x)
12972 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12973 return copseReclaimDelay[count];
12974}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, and sWorld.

Referenced by CalculateCorpseReclaimDelay(), and WorldSession::HandleReclaimCorpseOpcode().

◆ GetCreationTime()

Seconds Player::GetCreationTime ( ) const
inline
2547{ return m_creationTime; }

References m_creationTime.

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

uint32 Player::GetDeathTimer ( ) const
inline
2184{ return m_deathTimer; }

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

std::string Player::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

16388{
16389 std::stringstream sstr;
16390 sstr << Unit::GetDebugInfo();
16391 return sstr.str();
16392}
std::string GetDebugInfo() const override
Definition Unit.cpp:21402

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

DeclinedName const * Player::GetDeclinedNames ( ) const
inline
2512{ return m_declinedname; }

References m_declinedname.

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
423{
424 switch (source->GetTypeId())
425 {
426 case TYPEID_UNIT:
427 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
429 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
430 default:
431 break;
432 }
433
434 return 0;
435}
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:136
uint32 GossipMenuId
Definition CreatureData.h:194
uint32 GetGossipMenuId() const
Definition GameObjectData.h:552

References Creature::GetCreatureTemplate(), GameObject::GetGOInfo(), GameObjectTemplate::GetGossipMenuId(), Object::GetTypeId(), CreatureTemplate::GossipMenuId, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GetGossipTextId(), and PrepareGossipMenu().

◆ GetDelayedOperations()

uint32 Player::GetDelayedOperations ( ) const
inline

◆ GetDifficulty()

◆ GetDivider()

◆ GetDodgeFromAgility()

void Player::GetDodgeFromAgility ( float &  diminishing,
float &  nondiminishing 
)
Todo:
: research if talents/effects that increase total agility by x% should increase non-diminishing part
5134{
5135 // Table for base dodge values
5136 const float dodge_base[MAX_CLASSES] =
5137 {
5138 0.036640f, // Warrior
5139 0.034943f, // Paladi
5140 -0.040873f, // Hunter
5141 0.020957f, // Rogue
5142 0.034178f, // Priest
5143 0.036640f, // DK
5144 0.021080f, // Shaman
5145 0.036587f, // Mage
5146 0.024211f, // Warlock
5147 0.0f, // ??
5148 0.056097f // Druid
5149 };
5150 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5151 const float crit_to_dodge[MAX_CLASSES] =
5152 {
5153 0.85f / 1.15f, // Warrior
5154 1.00f / 1.15f, // Paladin
5155 1.11f / 1.15f, // Hunter
5156 2.00f / 1.15f, // Rogue
5157 1.00f / 1.15f, // Priest
5158 0.85f / 1.15f, // DK
5159 1.60f / 1.15f, // Shaman
5160 1.00f / 1.15f, // Mage
5161 0.97f / 1.15f, // Warlock (?)
5162 0.0f, // ??
5163 2.00f / 1.15f // Druid
5164 };
5165
5166 uint8 level = GetLevel();
5167 uint32 pclass = getClass();
5168
5169 if (level > GT_MAX_LEVEL)
5170 level = GT_MAX_LEVEL;
5171
5172 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5173 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5174 if (!dodgeRatio || pclass > MAX_CLASSES)
5175 return;
5176
5179 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5180
5181 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5182 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5183 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5184}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
#define MAX_CLASSES
Definition SharedDefines.h:155
@ UNIT_MOD_STAT_START
Definition Unit.h:170
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2092
float GetCreateStat(Stats stat) const
Definition Unit.h:1009
Definition DBCStructure.h:1056
float ratio
Definition DBCStructure.h:1057

References BASE_PCT, Unit::getClass(), Unit::GetCreateStat(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, Unit::m_auraModifiersGroup, MAX_CLASSES, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritStore, STAT_AGILITY, and UNIT_MOD_STAT_START.

Referenced by UpdateDodgePercentage().

◆ GetDrunkenstateByValue()

DrunkenState Player::GetDrunkenstateByValue ( uint8  value)
static
962{
963 if (value >= 90)
964 return DRUNKEN_SMASHED;
965 if (value >= 50)
966 return DRUNKEN_DRUNK;
967 if (value)
968 return DRUNKEN_TIPSY;
969 return DRUNKEN_SOBER;
970}
@ DRUNKEN_TIPSY
Definition Player.h:470
@ DRUNKEN_DRUNK
Definition Player.h:471
@ DRUNKEN_SOBER
Definition Player.h:469
@ DRUNKEN_SMASHED
Definition Player.h:472

References DRUNKEN_DRUNK, DRUNKEN_SMASHED, DRUNKEN_SOBER, and DRUNKEN_TIPSY.

Referenced by Condition::Meets(), AchievementCriteriaData::Meets(), and SetDrunkValue().

◆ GetDrunkValue()

◆ GetDungeonDifficulty()

◆ GetEntryPoint()

WorldLocation const & Player::GetEntryPoint ( ) const
inline

◆ GetExpertiseDodgeOrParryReduction()

float Player::GetExpertiseDodgeOrParryReduction ( WeaponAttackType  attType) const
5225{
5226 switch (attType)
5227 {
5228 case BASE_ATTACK:
5229 return GetUInt32Value(PLAYER_EXPERTISE) / 4.0f;
5230 case OFF_ATTACK:
5232 default:
5233 break;
5234 }
5235 return 0.0f;
5236}
@ PLAYER_EXPERTISE
Definition UpdateFields.h:349
@ PLAYER_OFFHAND_EXPERTISE
Definition UpdateFields.h:350

References BASE_ATTACK, Object::GetUInt32Value(), OFF_ATTACK, PLAYER_EXPERTISE, and PLAYER_OFFHAND_EXPERTISE.

◆ GetFakeDrunkValue()

int32 Player::GetFakeDrunkValue ( ) const
inline
@ PLAYER_FAKE_INEBRIATION
Definition UpdateFields.h:325
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:299

References Object::GetInt32Value(), and PLAYER_FAKE_INEBRIATION.

Referenced by UpdateInvisibilityDrunkDetect().

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16317{
16318 return _farSightDistance;
16319}
Optional< float > _farSightDistance
Definition Player.h:3011

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
467{
468 uint32 freeSpace = 0;
469
470 // Check backpack
471 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
472 {
474 if (!item)
475 freeSpace += 1;
476 }
477
478 // Check bags
480 {
481 if (Bag* bag = GetBagByPos(i))
482 freeSpace += bag->GetFreeSlots();
483 }
484
485 return freeSpace;
486}

References GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::CheckItems().

◆ GetFreePrimaryProfessionPoints()

uint32 Player::GetFreePrimaryProfessionPoints ( ) const
inline

◆ GetFreeTalentPoints()

uint32 Player::GetFreeTalentPoints ( ) const
inline
@ PLAYER_CHARACTER_POINTS1
Definition UpdateFields.h:342

References Object::GetUInt32Value(), and PLAYER_CHARACTER_POINTS1.

Referenced by BuildPlayerTalentsInfoData(), and LearnTalent().

◆ GetGameObjectIfCanInteractWith()

GameObject * Player::GetGameObjectIfCanInteractWith ( ObjectGuid  guid,
GameobjectTypes  type 
) const
2157{
2158 if (GameObject* go = GetMap()->GetGameObject(guid))
2159 {
2160 if (go->GetGoType() == type)
2161 {
2162 // Players cannot interact with gameobjects that use the "Point" icon
2163 if (go->GetGOInfo()->IconName == "Point")
2164 {
2165 return nullptr;
2166 }
2167
2168 if (go->IsWithinDistInMap(this))
2169 {
2170 return go;
2171 }
2172
2173 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2174 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2175 }
2176 }
2177 return nullptr;
2178}
GameObject * GetGameObject(uint32 spellId) const
Definition Unit.cpp:6225

References Unit::GetGameObject(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetName(), LOG_DEBUG, and Position::ToString().

Referenced by CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), and WorldSession::HandleGuildBankerActivate().

◆ GetGlobalCooldownMgr()

GlobalCooldownMgr & Player::GetGlobalCooldownMgr ( )
inline

◆ GetGlyph()

◆ GetGlyphSlot()

uint32 Player::GetGlyphSlot ( uint8  slot) const
inline
@ PLAYER_FIELD_GLYPH_SLOTS_1
Definition UpdateFields.h:388

References Object::GetUInt32Value(), and PLAYER_FIELD_GLYPH_SLOTS_1.

Referenced by _LoadGlyphAuras(), and Spell::EffectApplyGlyph().

◆ GetGossipTextId() [1/2]

uint32 Player::GetGossipTextId ( uint32  menuId,
WorldObject source 
)
405{
407
408 if (!menuId)
409 return textId;
410
411 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
412
413 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
414 {
415 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
416 textId = itr->second.TextID;
417 }
418
419 return textId;
420}
#define DEFAULT_GOSSIP_MESSAGE
Definition GossipDef.h:31
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition ObjectMgr.h:631

References DEFAULT_GOSSIP_MESSAGE, sConditionMgr, and sObjectMgr.

Referenced by GetGossipTextId(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), boss_gloomrel::OnGossipHello(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_zulaman_hostage::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_high_overlord_saurfang_icc::OnGossipHello(), npc_muradin_bronzebeard_icc::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_zephyr::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_engineering_tele_trinket::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_sayge::OnGossipHello(), npc_wormhole::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_experience::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), icecrown_citadel_teleport::OnGossipHello(), npc_prof_blacksmith::SendActionMenu(), npc_prof_alchemy::SendConfirmLearn(), npc_prof_blacksmith::SendConfirmLearn(), npc_prof_tailor::SendConfirmLearn(), go_evil_book_for_dummies::SendConfirmLearn(), npc_prof_alchemy::SendConfirmUnlearn(), npc_prof_blacksmith::SendConfirmUnlearn(), npc_prof_tailor::SendConfirmUnlearn(), go_evil_book_for_dummies::SendConfirmUnlearn(), SendPreparedGossip(), SendPreparedQuest(), npc_echo_of_medivh::sGossipHello(), and npc_chesspiece::sGossipHello().

◆ GetGossipTextId() [2/2]

uint32 Player::GetGossipTextId ( WorldObject source)
397{
398 if (!source)
400
401 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
402}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition PlayerGossip.cpp:422
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition PlayerGossip.cpp:404

References DEFAULT_GOSSIP_MESSAGE, GetDefaultGossipMenuForSource(), and GetGossipTextId().

◆ GetGracePeriod()

uint32 Player::GetGracePeriod ( uint8  index) const
inline
2517{ return m_runes->runes[index].GracePeriod; }
uint32 GracePeriod
Definition Player.h:426

References RuneInfo::GracePeriod, m_runes, and Runes::runes.

Referenced by GetRuneBaseCooldown(), and RegenerateAll().

◆ GetGrantableLevels()

uint8 Player::GetGrantableLevels ( )
inline

◆ GetGroup() [1/2]

Group * Player::GetGroup ( )
inline
2476{ return m_group.getTarget(); }
GroupReference m_group
Definition Player.h:2903
TO * getTarget() const
Definition Reference.h:95

References Reference< TO, FROM >::getTarget(), and m_group.

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), InstanceMap::CannotEnter(), CanRollForItemInLFG(), CanUninviteFromGroup(), Spell::CheckCast(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), CheckInstanceLoginValid(), MapInstanced::CreateInstanceForPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), ArenaTeam::DelMember(), Group::Disband(), WorldSession::DoLootRelease(), DoRandomRoll(), SmartAI::EndPath(), Loot::FillLoot(), GetNextRandomRaidMember(), Unit::GetNextRandomRaidMemberOrPet(), Unit::GetPartyMembers(), ChatHandler::GetPlayerGroupAndGUIDByName(), GetsRecruitAFriendBonus(), GroupEventHappens(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), Unit::HandleAuraRaidProcFromChargeWithValue(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), Unit::HandleDummyAuraProc(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupAssistantLeaderOpcode(), WorldSession::HandleGroupChangeSubGroupOpcode(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupJoinCommand(), WorldSession::HandleGroupRaidConvertOpcode(), WorldSession::HandleGroupSetLeaderOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::HandleInstanceLockResponse(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), WorldSession::HandleLfgLeaveOpcode(), WorldSession::HandleLfgPartyLockInfoRequestOpcode(), WorldSession::HandleLfgSetRolesOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMethodOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMinimapPingOpcode(), WorldSession::HandlePartyAssignmentOpcode(), WorldSession::HandlePetRename(), Battlefield::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), WorldSession::HandleRaidTargetUpdateOpcode(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), misc_commandscript::HandleSummonCommand(), tele_commandscript::HandleTeleGroupCommand(), HasQuestForGO(), HasQuestForItem(), isAllowedToLoot(), SmartAI::IsEscortInvokerInRange(), Unit::IsInPartyWith(), IsInSameGroupWith(), IsInSameRaidWith(), GameObject::IsLootAllowedFor(), Creature::isTappedBy(), lfg::LFGMgr::JoinLfg(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_ahune::JustDied(), Unit::Kill(), KilledMonsterCredit(), KilledPlayerCredit(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), lfg::LFGMgr::MakeNewGroup(), lfg::LFGPlayerScript::OnBindToInstance(), npc_icc_buff_switcher::OnGossipSelect(), lfg::LFGPlayerScript::OnLevelChanged(), lfg::LFGPlayerScript::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnPlayerEnter(), Acore::MostHPMissingGroupInRange::operator()(), InstanceMap::PermBindAllPlayers(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerGetDestinationInstanceId(), ProcessDelayedOperations(), RemoveFromGroup(), RemovePet(), RewardPlayerAndGroupAtEvent(), Group::SameSubGroup(), Satisfy(), SendInitialPacketsAfterAddToMap(), SendLoot(), SendNewItem(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendUpdateToOutOfRangeGroupMembers(), Group::SendUpdateToPlayer(), SetBattlegroundOrBattlefieldRaid(), Unit::SetHealth(), Creature::SetLootRecipient(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), Unit::setPowerType(), StoreLootItem(), lfg::LFGMgr::TeleportPlayer(), PetAI::UpdateAllies(), Unit::UpdateAuraForGroup(), UpdatePosition(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateZone(), and GameObject::Use().

◆ GetGroup() [2/2]

const Group * Player::GetGroup ( ) const
inline
2477{ return (const Group*)m_group.getTarget(); }

References Reference< TO, FROM >::getTarget(), and m_group.

◆ GetGroupInvite()

◆ GetGroupRef()

GroupReference & Player::GetGroupRef ( )
inline
2478{ return m_group; }

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
16042{
16043 uint32 guildId = GetGuildId();
16044 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
16045}

References GetGuildId(), and sGuildMgr.

Referenced by GiveLevel(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleGuildRankOpcode(), Guild::HandleInviteMember(), and UpdateZone().

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15381{
15382 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15383}

References GetGuildId(), and sGuildMgr.

◆ GetHealthBonusFromStamina()

float Player::GetHealthBonusFromStamina ( )
277{
278 float stamina = GetStat(STAT_STAMINA);
279
280 float baseStam = stamina < 20 ? stamina : 20;
281 float moreStam = stamina - baseStam;
282
283 return baseStam + (moreStam * 10.0f);
284}

References Unit::GetStat(), and STAT_STAMINA.

Referenced by UpdateMaxHealth().

◆ GetHonorPoints()

◆ GetInGameTime()

uint32 Player::GetInGameTime ( )
inline
1561{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1699{
1700 GetAurasForTarget(target);
1701 if (target->IsAlive())
1702 {
1704 target->GetVictim())
1705 target->SendMeleeAttackStart(target->GetVictim(), this);
1706 }
1707}
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
void GetAurasForTarget(Unit *target, bool force=false)
Definition Player.cpp:12097
Unit * GetVictim() const
Definition Unit.h:862
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3076

References GetAurasForTarget(), Unit::GetVictim(), Unit::HasUnitState(), Unit::IsAlive(), Unit::SendMeleeAttackStart(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by Acore::VisibleNotifier::SendToSelf(), and UpdateVisibilityOf().

◆ GetInnTriggerId()

uint32 Player::GetInnTriggerId ( ) const
inline
1217{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3370{
3371 // in inventory
3373 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3374 if (pItem->GetEntry() == entry)
3375 return pItem;
3376
3378 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3379 if (pItem->GetEntry() == entry)
3380 return pItem;
3381
3382 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3383 if (Bag* pBag = GetBagByPos(i))
3384 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3385 if (Item* pItem = pBag->GetItemByPos(j))
3386 if (pItem->GetEntry() == entry)
3387 return pItem;
3388
3389 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3390 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3391 if (pItem->GetEntry() == entry)
3392 return pItem;
3393
3394 return nullptr;
3395}

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by Spell::CheckItems(), Spell::EffectRechargeManaGem(), and Spell::EffectStuck().

◆ GetItemByGuid()

Item * Player::GetItemByGuid ( ObjectGuid  guid) const
408{
410 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
411 if (pItem->GetGUID() == guid)
412 return pItem;
413
415 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
416 if (pItem->GetGUID() == guid)
417 return pItem;
418
419 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
420 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
421 if (pItem->GetGUID() == guid)
422 return pItem;
423
425 if (Bag* pBag = GetBagByPos(i))
426 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
427 if (Item* pItem = pBag->GetItemByPos(j))
428 if (pItem->GetGUID() == guid)
429 return pItem;
430
432 if (Bag* pBag = GetBagByPos(i))
433 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
434 if (Item* pItem = pBag->GetItemByPos(j))
435 if (pItem->GetGUID() == guid)
436 return pItem;
437
438 return nullptr;
439}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by _SaveInventory(), Spell::CheckCast(), WorldSession::DoLootRelease(), TradeData::GetItem(), TradeData::GetSpellCastItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), debug_commandscript::HandleDebugGetItemValueCommand(), debug_commandscript::HandleDebugItemExpireCommand(), debug_commandscript::HandleDebugSetItemValueCommand(), Unit::HandleDummyAuraProc(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleItemRefund(), WorldSession::HandleItemRefundInfoRequest(), WorldSession::HandleItemTextQuery(), WorldSession::HandleLootMoneyOpcode(), Unit::HandleOverrideClassScriptAuraProc(), WorldSession::HandlePetitionRenameOpcode(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), SendLoot(), SpellCastTargets::Update(), and Spell::UpdatePointers().

◆ GetItemByPos() [1/2]

Item * Player::GetItemByPos ( uint16  pos) const
442{
443 uint8 bag = pos >> 8;
444 uint8 slot = pos & 255;
445 return GetItemByPos(bag, slot);
446}

References GetItemByPos().

Referenced by _SaveCharacter(), _SaveInventory(), _StoreItem(), AutoUnequipOffhandIfNeed(), BuildEnchantmentsInfoData(), CanEquipItem(), CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanStoreItems(), CanUnequipItem(), CanUnequipItems(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Create(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), DurabilityLossAll(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), DurabilityRepair(), Spell::EffectDurabilityDamage(), Spell::EffectDurabilityDamagePCT(), Spell::EffectEnchantHeldItem(), EnchantmentFitsRequirements(), EquipItem(), EquippedOk(), FindEquipSlot(), GetBagByPos(), GetFreeInventorySpace(), GetItemByEntry(), GetItemByGuid(), GetItemByPos(), GetItemCount(), GetItemCountWithLimitCategory(), GetShield(), GetUseableItemByPos(), GetWeaponForAttack(), misc_commandscript::HandleAddItemCommand(), spell_rog_deadly_poison::HandleAfterHit(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModShapeshift(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), bg_commandscript::HandleBagsClearCommand(), WorldSession::HandleCancelTempEnchantmentOpcode(), character_commandscript::HandleCharacterCheckBagCommand(), debug_commandscript::HandleDebugGetItemStateCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetSave(), WorldSession::HandleEquipmentSetUse(), inventory_commandscript::HandleInventoryCountCommand(), WorldSession::HandleMirrorImageDataRequest(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleReadItem(), WorldSession::HandleSetTradeItemOpcode(), WorldSession::HandleWrapItemOpcode(), HasItemCount(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), HasItemTotemCategory(), IsTwoHandUsed(), MoveItemFromInventory(), RemoveArenaEnchantments(), RemoveItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
449{
450 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
451 return m_items[slot];
452 else if (Bag* pBag = GetBagByPos(bag))
453 return pBag->GetItemByPos(slot);
454 return nullptr;
455}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START, and m_items.

◆ GetItemCount()

uint32 Player::GetItemCount ( uint32  item,
bool  inBankAlso = false,
Item skipItem = nullptr 
) const
328{
329 uint32 count = 0;
331 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
332 if (pItem != skipItem && pItem->GetEntry() == item)
333 count += pItem->GetCount();
334
336 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
337 if (pItem != skipItem && pItem->GetEntry() == item)
338 count += pItem->GetCount();
339
341 if (Bag* pBag = GetBagByPos(i))
342 count += pBag->GetItemCount(item, skipItem);
343
344 if (skipItem && skipItem->GetTemplate()->GemProperties)
346 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
347 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
348 count += pItem->GetGemCountWithID(item);
349
350 if (inBankAlso)
351 {
352 // checking every item from 39 to 74 (including bank bags)
354 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
355 if (pItem != skipItem && pItem->GetEntry() == item)
356 count += pItem->GetCount();
357
359 if (Bag* pBag = GetBagByPos(i))
360 count += pBag->GetItemCount(item, skipItem);
361
362 if (skipItem && skipItem->GetTemplate()->GemProperties)
364 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
365 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
366 count += pItem->GetGemCountWithID(item);
367 }
368
369 return count;
370}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, _Socket::Color, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, KEYRING_SLOT_START, and ItemTemplate::Socket.

Referenced by AdjustQuestReqItemCount(), CanRewardQuest(), CanRollOnItem(), CanTakeMoreSimilarItems(), WorldSession::HandleSetAmmoOpcode(), HasQuestForItem(), npc_venomhide_hatchling::npc_venomhide_hatchlingAI::IsSummonedBy(), ItemRemovedQuestCheck(), npc_adventurous_dwarf::OnGossipHello(), SendNewItem(), and PlayerMenu::SendQuestGiverRequestItems().

◆ GetItemCountWithLimitCategory()

uint32 Player::GetItemCountWithLimitCategory ( uint32  limitCategory,
Item skipItem = nullptr 
) const
373{
374 uint32 count = 0;
375 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
376 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
377 if (pItem != skipItem)
378 if (ItemTemplate const* pProto = pItem->GetTemplate())
379 if (pProto->ItemLimitCategory == limitCategory)
380 count += pItem->GetCount();
381
382 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
383 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
384 if (pItem != skipItem)
385 if (ItemTemplate const* pProto = pItem->GetTemplate())
386 if (pProto->ItemLimitCategory == limitCategory)
387 count += pItem->GetCount();
388
390 if (Bag* pBag = GetBagByPos(i))
391 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
392
393 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
394 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
395 if (pItem != skipItem)
396 if (ItemTemplate const* pProto = pItem->GetTemplate())
397 if (pProto->ItemLimitCategory == limitCategory)
398 count += pItem->GetCount();
399
400 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
401 if (Bag* pBag = GetBagByPos(i))
402 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
403
404 return count;
405}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by CanTakeMoreSimilarItems().

◆ GetItemFromBuyBackSlot()

Item * Player::GetItemFromBuyBackSlot ( uint32  slot)
3988{
3989 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
3990 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3991 return m_items[slot];
3992 return nullptr;
3993}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ GetItemUpdateQueue()

std::vector< Item * > & Player::GetItemUpdateQueue ( )
inline

◆ GetLastPetNumber()

uint32 Player::GetLastPetNumber ( ) const
inline
2465{ return m_lastpetnumber; }

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

uint32 Player::GetLastPotionId ( )
inline
1819{ return m_lastPotionId; }

References m_lastPotionId.

Referenced by Spell::CheckCast(), and UpdatePotionCooldown().

◆ GetLastUsedRune()

RuneType Player::GetLastUsedRune ( )
inline
2520{ return m_runes->lastUsedRune; }
RuneType lastUsedRune
Definition Player.h:434

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3819{
3820 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3821 {
3822 if ((*itr)->messageID == id)
3823 {
3824 return (*itr);
3825 }
3826 }
3827 return nullptr;
3828}

References m_mail.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailMarkAsRead(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), and WorldSession::HandleMailTakeMoney().

◆ GetMails()

PlayerMails const & Player::GetMails ( ) const
inline

◆ GetMailSize()

uint32 Player::GetMailSize ( )
inline
1657{ return m_mail.size();}

References m_mail.

Referenced by _SaveMail(), and WorldSession::HandleSendMail().

◆ GetManaBonusFromIntellect()

float Player::GetManaBonusFromIntellect ( )
287{
288 float intellect = GetStat(STAT_INTELLECT);
289
290 float baseInt = intellect < 20 ? intellect : 20;
291 float moreInt = intellect - baseInt;
292
293 return baseInt + (moreInt * 15.0f);
294}

References Unit::GetStat(), and STAT_INTELLECT.

Referenced by UpdateMaxPower().

◆ GetMapRef()

MapReference & Player::GetMapRef ( )
inline
2499{ return m_mapRef; }
MapReference m_mapRef
Definition Player.h:2958

References m_mapRef.

Referenced by InstanceMap::CannotEnter(), BattlegroundMap::CannotEnter(), ResetMap(), and Map::UpdateIteratorBack().

◆ GetMaxKeyringSize()

uint32 Player::GetMaxKeyringSize ( ) const
inline

◆ GetMaxPersonalArenaRatingRequirement()

uint32 Player::GetMaxPersonalArenaRatingRequirement ( uint32  minarenaslot) const

If trans is specified, arena point save query will be added to trans.

10925{
10926 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10927 // the personal rating of the arena team must match the required limit as well
10928 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10929 uint32 max_personal_rating = 0;
10930 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10931 {
10932 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10933 {
10934 uint32 p_rating = GetArenaPersonalRating(i);
10935 uint32 t_rating = at->GetRating();
10936 p_rating = p_rating < t_rating ? p_rating : t_rating;
10937 if (max_personal_rating < p_rating)
10938 max_personal_rating = p_rating;
10939 }
10940 }
10941
10942 sScriptMgr->OnGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10943
10944 return max_personal_rating;
10945}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition Player.cpp:16238
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16247

References GetArenaPersonalRating(), GetArenaTeamId(), MAX_ARENA_SLOT, sArenaTeamMgr, and sScriptMgr.

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5489{
5490 if (!skill)
5491 return 0;
5492
5493 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5494 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5495 return 0;
5496
5497 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5498
5499 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5500 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5501 result += SKILL_TEMP_BONUS(bonus);
5502 result += SKILL_PERM_BONUS(bonus);
5503 return result < 0 ? 0 : result;
5504}
#define SKILL_TEMP_BONUS(x)
Definition Player.h:86

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, SKILL_PERM_BONUS, SKILL_TEMP_BONUS, and sScriptMgr.

Referenced by Unit::GetDefenseSkillValue(), and UpdateFishingSkill().

◆ GetMaxSkillValueForLevel()

uint16 Player::GetMaxSkillValueForLevel ( ) const
16275{
16277
16278 sScriptMgr->OnGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16279
16280 return result;
16281}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1139

References Unit::GetMaxSkillValueForLevel(), and sScriptMgr.

Referenced by _addSpell(), _LoadSkills(), GetMissPercentageFromDefence(), LearnDefaultSkill(), removeSpell(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDodgePercentage(), UpdateParryPercentage(), and UpdateSkillsForLevel().

◆ getMaxTimer()

int32 Player::getMaxTimer ( MirrorTimerType  timer)
protected
809{
810 switch (timer)
811 {
812 case FATIGUE_TIMER:
813 return MINUTE * IN_MILLISECONDS;
814 case BREATH_TIMER:
815 {
818 int32 UnderWaterTime = sWorld->getIntConfig(CONFIG_WATER_BREATH_TIMER);
820 for (AuraEffectList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
821 AddPct(UnderWaterTime, (*i)->GetAmount());
822 return UnderWaterTime;
823 }
824 case FIRE_TIMER:
825 {
826 if (!IsAlive())
828 return 2020;
829 }
830 default:
831 return 0;
832 }
833}
AccountTypes
Definition Common.h:56
@ CONFIG_WATER_BREATH_TIMER
Definition IWorld.h:420
@ CONFIG_DISABLE_BREATHING
Definition IWorld.h:307
@ FIRE_TIMER
Definition Player.h:581
@ FATIGUE_TIMER
Definition Player.h:579
@ BREATH_TIMER
Definition Player.h:580
@ SPELL_AURA_MOD_WATER_BREATHING
Definition SpellAuraDefines.h:218
bool HasWaterBreathingAura() const
Definition Unit.h:1725

References AddPct(), BREATH_TIMER, CONFIG_DISABLE_BREATHING, CONFIG_WATER_BREATH_TIMER, DISABLED_MIRROR_TIMER, FATIGUE_TIMER, FIRE_TIMER, Unit::GetAuraEffectsByType(), GetSession(), Unit::HasWaterBreathingAura(), IN_MILLISECONDS, Unit::IsAlive(), MINUTE, SPELL_AURA_MOD_WATER_BREATHING, and sWorld.

Referenced by HandleDrowning(), and IsMirrorTimerActive().

◆ GetMeleeCritFromAgility()

float Player::GetMeleeCritFromAgility ( )
5117{
5118 uint8 level = GetLevel();
5119 uint32 pclass = getClass();
5120
5121 if (level > GT_MAX_LEVEL)
5122 level = GT_MAX_LEVEL;
5123
5124 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5125 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5126 if (!critBase || !critRatio)
5127 return 0.0f;
5128
5129 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5130 return crit * 100.0f;
5131}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition DBCStructure.h:1051
float base
Definition DBCStructure.h:1052

References GtChanceToMeleeCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritBaseStore, sGtChanceToMeleeCritStore, and STAT_AGILITY.

Referenced by UpdateAllCritPercentages().

◆ GetMeleeDamageSchoolMask()

SpellSchoolMask Player::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
overridevirtual

Implements Unit.

7019{
7020 if (Item const* weapon = GetWeaponForAttack(attackType, true))
7021 {
7022 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
7023 }
7024
7026}
SpellSchoolMask
Definition SharedDefines.h:295

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

float Player::GetMissPercentageFromDefence ( ) const
709{
710 float const miss_cap[MAX_CLASSES] =
711 {
712 16.00f, // Warrior //correct
713 16.00f, // Paladin //correct
714 16.00f, // Hunter //?
715 16.00f, // Rogue //?
716 16.00f, // Priest //?
717 16.00f, // DK //correct
718 16.00f, // Shaman //?
719 16.00f, // Mage //?
720 16.00f, // Warlock //?
721 0.0f, // ??
722 16.00f // Druid //?
723 };
724
725 float diminishing = 0.0f, nondiminishing = 0.0f;
726 // Modify value from defense skill (only bonus from defense rating diminishes)
727 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
728 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
729
730 // apply diminishing formula to diminishing miss chance
731 uint32 pclass = getClass() - 1;
732 return nondiminishing + (diminishing * miss_cap[pclass] / (diminishing + miss_cap[pclass] * m_diminishing_k[pclass]));
733}
const float m_diminishing_k[MAX_CLASSES]
Definition StatSystem.cpp:693
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5219

References CR_DEFENSE_SKILL, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), m_diminishing_k, MAX_CLASSES, and SKILL_DEFENSE.

◆ GetMItem()

Item * Player::GetMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1676 {
1677 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1678 return itr != mMitems.end() ? itr->second : nullptr;
1679 }

References mMitems.

Referenced by WorldSession::HandleGetMailList(), WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15340{
15341 uint32 specPoints[3] = {0, 0, 0};
15342 const PlayerTalentMap& talentMap = GetTalentMap();
15343 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15344 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15345 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15346 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15347 if (tab->tabpage < 3)
15348 {
15349 // find current talent rank
15350 uint8 currentTalentRank = 0;
15351 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15352 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15353 {
15354 currentTalentRank = rank + 1;
15355 break;
15356 }
15357 specPoints[tab->tabpage] += currentTalentRank;
15358 }
15359 uint8 maxIndex = 0;
15360 uint8 maxCount = specPoints[0];
15361 for (uint8 i = 1; i < 3; ++i)
15362 if (specPoints[i] > maxCount)
15363 {
15364 maxIndex = i;
15365 maxCount = specPoints[i];
15366 }
15367 return maxIndex;
15368}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

◆ GetMountBlockId()

uint32 Player::GetMountBlockId ( )
inline

◆ GetNextQuest()

Quest const * Player::GetNextQuest ( ObjectGuid  guid,
Quest const *  quest 
)
208{
209 QuestRelationBounds objectQR;
210
212 if (creature)
213 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
214 else
215 {
216 //we should obtain map pointer from GetMap() in 99% of cases. Special case
217 //only for quests which cast teleport spells on player
219 ASSERT(_map);
220 GameObject* pGameObject = _map->GetGameObject(guid);
221 if (pGameObject)
222 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
223 else
224 return nullptr;
225 }
226
227 uint32 nextQuestID = quest->GetNextQuestInChain();
228 for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr)
229 {
230 if (itr->second == nextQuestID)
231 return sObjectMgr->GetQuestTemplate(nextQuestID);
232 }
233
234 return nullptr;
235}
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition ObjectMgr.h:525
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition ObjectAccessor.cpp:234

References ASSERT, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), Quest::GetNextQuestInChain(), Object::IsInWorld(), sMapMgr, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ GetNextRandomRaidMember()

Player * Player::GetNextRandomRaidMember ( float  radius)
13025{
13026 Group* group = GetGroup();
13027 if (!group)
13028 return nullptr;
13029
13030 std::vector<Player*> nearMembers;
13031 nearMembers.reserve(group->GetMembersCount());
13032
13033 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
13034 {
13035 Player* Target = itr->GetSource();
13036
13037 // IsHostileTo check duel and controlled by enemy
13038 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
13039 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
13040 nearMembers.push_back(Target);
13041 }
13042
13043 if (nearMembers.empty())
13044 return nullptr;
13045
13046 uint32 randTarget = urand(0, nearMembers.size() - 1);
13047 return nearMembers[randTarget];
13048}
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10290

References Group::GetFirstMember(), GetGroup(), Group::GetMembersCount(), Unit::HasInvisibilityAura(), Unit::IsHostileTo(), WorldObject::IsWithinDistInMap(), and urand().

◆ GetNextSave()

uint32 Player::GetNextSave ( ) const
inline
2619{ return m_nextSave; }

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid  guid,
uint32  npcflagmask 
)
2100{
2101 // unit checks
2102 if (!guid)
2103 return nullptr;
2104
2105 if (!IsInWorld())
2106 return nullptr;
2107
2108 if (IsInFlight())
2109 return nullptr;
2110
2111 // exist (we need look pets also for some interaction (quest/etc)
2112 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2113 if (!creature)
2114 return nullptr;
2115
2116 // Deathstate checks
2118 return nullptr;
2119
2120 // alive or spirit healer
2122 return nullptr;
2123
2124 // appropriate npc type
2125 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2126 return nullptr;
2127
2128 // not allow interaction under control, but allow with own pets
2129 if (creature->GetCharmerGUID())
2130 return nullptr;
2131
2132 // xinef: perform better check
2133 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2134 return nullptr;
2135
2136 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2137 // not unfriendly
2138 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2139 // if (factionTemplate->faction)
2140 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2141 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2142 // return nullptr;
2143
2144 // not too far
2145 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2146 return nullptr;
2147
2148 // pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
2149 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2151 return nullptr;
2152
2153 return creature;
2154}
#define INTERACTION_DISTANCE
Definition ObjectDefines.h:24
Classes
Definition SharedDefines.h:139
@ REP_UNFRIENDLY
Definition SharedDefines.h:182
@ TRAINER_TYPE_CLASS
Definition SharedDefines.h:2617
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition SharedDefines.h:2696
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition SharedDefines.h:2702
@ CLASS_CONTEXT_CLASS_TRAINER
Definition UnitDefines.h:243
NPCFlags
Non Player Character flags.
Definition UnitDefines.h:313
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition UnitDefines.h:320
@ UNIT_NPC_FLAG_TRAINER
Definition UnitDefines.h:319
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10118
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:734
ObjectGuid GetCharmerGUID() const
Definition Unit.h:690
uint32 trainer_class
Definition CreatureData.h:220
uint32 type_flags
Definition CreatureData.h:223
uint32 trainer_type
Definition CreatureData.h:218

References CLASS_CONTEXT_CLASS_TRAINER, CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), IsClass(), Unit::IsInFlight(), Object::IsInWorld(), WorldObject::IsWithinDistInMap(), REP_UNFRIENDLY, CreatureTemplate::trainer_class, CreatureTemplate::trainer_type, TRAINER_TYPE_CLASS, CreatureTemplate::type_flags, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_TRAINER_CLASS.

Referenced by BuyItemFromVendorSlot(), CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), WorldSession::CanUseBank(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::SendListInventory(), WorldSession::SendPetitionShowList(), and WorldSession::SendTrainerList().

◆ GetOriginalGroup()

◆ GetOriginalGroupRef()

GroupReference & Player::GetOriginalGroupRef ( )
inline
2492{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

uint8 Player::GetOriginalSubGroup ( ) const
inline
2493{ return m_originalGroup.getSubGroup(); }
uint8 getSubGroup() const
Definition GroupReference.h:38

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15620{
15621 if (!m_petStable)
15622 m_petStable = std::make_unique<PetStable>();
15623
15624 return *m_petStable;
15625}

References m_petStable.

Referenced by WorldSession::HandleBuyStableSlot(), Unit::InitTamedPet(), and SummonPet().

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12551{
12552 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12553}
#define sOutdoorPvPMgr
Definition OutdoorPvPMgr.h:102

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Unit::Kill().

◆ GetPassOnGroupLoot()

bool Player::GetPassOnGroupLoot ( ) const
inline
2497{ return m_bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by Group::GroupLoot(), and Group::NeedBeforeGreed().

◆ GetPendingBind()

uint32 Player::GetPendingBind ( ) const
inline
2448{ return _pendingBindId; }

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8945{
8946 if (ObjectGuid pet_guid = GetPetGUID())
8947 {
8948 if (!pet_guid.IsPet())
8949 return nullptr;
8950
8951 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8952
8953 if (!pet)
8954 return nullptr;
8955
8956 if (IsInWorld())
8957 return pet;
8958
8959 //there may be a guardian in slot
8960 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8961 //const_cast<Player*>(this)->SetPetGUID(0);
8962 }
8963
8964 return nullptr;
8965}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:215

References ObjectAccessor::GetPet(), Unit::GetPetGUID(), and Object::IsInWorld().

Referenced by Spell::_cast(), KillRewarder::_RewardXP(), ActivateSpec(), Battleground::AddPlayer(), AuraEffect::ApplySpellMod(), WorldSession::BuildPartyMemberStatsChangedPacket(), BuildPetTalentsInfoData(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), Unit::DealDamage(), spell_hun_masters_call::DoCheckCast(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::EffectFeedPet(), Spell::EffectResurrectPet(), Spell::EffectSummonPet(), GiveLevel(), AuraEffect::HandleAuraModPetTalentsPoints(), spell_hun_masters_call::HandleDummy(), learn_commandscript::HandleLearnAllMyPetTalentsCommand(), AuraEffect::HandleModPossessPet(), WorldSession::HandleMoveTeleportAck(), pet_commandscript::HandlePetLearnCommand(), pet_commandscript::HandlePetUnlearnCommand(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRequestPartyMemberStatsOpcode(), WorldSession::HandleRequestPetInfo(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), InitStatsForLevel(), Unit::Kill(), LearnPetTalent(), Pet::LoadPetFromDB(), go_orb_of_domination::OnGossipHello(), PetSpellInitialize(), PrepareGossipMenu(), RemoveArenaSpellCooldowns(), RemovePet(), ResetPetTalents(), SaveToDB(), SendUpdateToOutOfRangeGroupMembers(), SetGameMaster(), Unit::SetSpeed(), TeleportTo(), UnsummonPetTemporaryIfAny(), and Update().

◆ GetPetStable() [1/2]

◆ GetPetStable() [2/2]

PetStable const * Player::GetPetStable ( ) const
inline
1221{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13811{
13813
13814 if (!phase)
13816
13817 // some aura phases include 1 normal map in addition to phase itself
13818 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13819 if (n_phase > 0)
13820 return n_phase;
13821
13822 return phase;
13823}
@ PHASEMASK_NORMAL
Definition Object.h:60
phase
Definition boss_skadi.cpp:103
uint32 GetPhaseByAuras() const
Definition Unit.cpp:19104
uint32 GetPhaseMask() const
Definition Object.h:451

References Unit::GetPhaseByAuras(), WorldObject::GetPhaseMask(), IsGameMaster(), and PHASEMASK_NORMAL.

Referenced by gobject_commandscript::HandleGameObjectAddCommand(), npc_commandscript::HandleNpcAddCommand(), wp_commandscript::HandleWpModifyCommand(), and wp_commandscript::HandleWpShowCommand().

◆ GetPlayerFlags()

PlayerFlags Player::GetPlayerFlags ( ) const
inline
PlayerFlags
Definition Player.h:478
@ PLAYER_FLAGS
Definition UpdateFields.h:178

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16333{
16334 std::string name = GetName();
16335 std::string color = "";
16336
16337 switch (getClass())
16338 {
16339 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16340 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16341 case CLASS_HUNTER: color = "|cffABD473"; break;
16342 case CLASS_MAGE: color = "|cff69CCF0"; break;
16343 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16344 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16345 case CLASS_ROGUE: color = "|cffFFF569"; break;
16346 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16347 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16348 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16349 }
16350
16351 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16352}
@ CLASS_PRIEST
Definition SharedDefines.h:145

References CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, Unit::getClass(), and WorldObject::GetName().

Referenced by gear_commandscript::HandleGearStatsCommand().

◆ GetPlayerSetting()

PlayerSetting Player::GetPlayerSetting ( std::string  source,
uint8  index 
)
71{
72 auto itr = m_charSettingsMap.find(source);
73
74 if (itr == m_charSettingsMap.end())
75 {
76 // Settings not found, this will initialize a new entry.
77 UpdatePlayerSetting(source, index, 0);
78 return GetPlayerSetting(source, index);
79 }
80
81 PlayerSettingVector settingVector = itr->second;
82 if (settingVector.size() < (uint8)(index + 1))
83 {
84 UpdatePlayerSetting(source, index, 0);
85 return GetPlayerSetting(source, index);
86 }
87
88 return itr->second[index];
89}
void UpdatePlayerSetting(std::string source, uint8 index, uint32 value)
Definition PlayerSettings.cpp:115
PlayerSetting GetPlayerSetting(std::string source, uint8 index)
Definition PlayerSettings.cpp:70

References GetPlayerSetting(), m_charSettingsMap, and UpdatePlayerSetting().

Referenced by GetPlayerSetting(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), and ChatHandler::SendWorldTextOptional().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5507{
5508 if (!skill)
5509 return 0;
5510
5511 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5512 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5513 return 0;
5514
5515 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5516
5517 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5518
5519 return result < 0 ? 0 : result;
5520}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, and sScriptMgr.

Referenced by _addSpell(), learn_commandscript::HandleLearnAllRecipesCommand(), lookup_commandscript::HandleLookupSkillCommand(), misc_commandscript::HandleSetSkillCommand(), and removeSpell().

◆ GetPureSkillValue()

uint16 Player::GetPureSkillValue ( uint32  skill) const

◆ GetQuestDialogStatus()

QuestGiverStatus Player::GetQuestDialogStatus ( Object questGiver)
1596{
1599
1600 sScriptMgr->GetDialogStatus(this, questgiver);
1601
1602 switch (questgiver->GetTypeId())
1603 {
1604 case TYPEID_GAMEOBJECT:
1605 {
1606 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1607 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1608 return questStatus;
1609 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1610 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1611 break;
1612 }
1613 case TYPEID_UNIT:
1614 {
1615 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1616 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1617 return questStatus;
1618 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1619 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1620 break;
1621 }
1622 default:
1623 // it's impossible, but check
1624 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1625 return DIALOG_STATUS_NONE;
1626 }
1627
1629
1630 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1631 {
1633 uint32 questId = i->second;
1634 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1635 if (!quest)
1636 continue;
1637
1638 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1639 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1640 continue;
1641
1642 QuestStatus status = GetQuestStatus(questId);
1643 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1644 {
1645 result2 = DIALOG_STATUS_REWARD;
1646 }
1647 else if (status == QUEST_STATUS_INCOMPLETE)
1648 {
1649 result2 = DIALOG_STATUS_INCOMPLETE;
1650 }
1651
1652 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1653 {
1654 result2 = DIALOG_STATUS_REWARD_REP;
1655 }
1656
1657 if (result2 > result)
1658 {
1659 result = result2;
1660 }
1661 }
1662
1663 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1664 {
1666 uint32 questId = i->second;
1667 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1668 if (!quest)
1669 continue;
1670
1671 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1672 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1673 continue;
1674
1675 QuestStatus status = GetQuestStatus(questId);
1676 if (status == QUEST_STATUS_NONE)
1677 {
1678 if (CanSeeStartQuest(quest))
1679 {
1680 if (SatisfyQuestLevel(quest, false))
1681 {
1682 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1683
1684 if (quest->IsRepeatable())
1685 {
1686 if (quest->IsDaily())
1687 {
1688 if (isNotLowLevelQuest)
1689 {
1691 }
1692 else
1693 {
1695 }
1696 }
1697 else if (quest->IsWeekly() || quest->IsMonthly())
1698 {
1699 if (isNotLowLevelQuest)
1700 {
1701 result2 = DIALOG_STATUS_AVAILABLE;
1702 }
1703 else
1704 {
1706 }
1707 }
1708 else if (quest->IsAutoComplete())
1709 {
1710 if (isNotLowLevelQuest)
1711 {
1712 result2 = DIALOG_STATUS_REWARD_REP;
1713 }
1714 else
1715 {
1717 }
1718 }
1719 else
1720 {
1721 if (isNotLowLevelQuest)
1722 {
1723 result2 = DIALOG_STATUS_REWARD_REP;
1724 }
1725 else
1726 {
1728 }
1729 }
1730 }
1731 else
1732 {
1733 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1734 }
1735 }
1736 else
1737 {
1738 result2 = DIALOG_STATUS_UNAVAILABLE;
1739 }
1740 }
1741 }
1742
1743 if (result2 > result)
1744 result = result2;
1745 }
1746
1747 return result;
1748}
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition ConditionMgr.h:142
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition IWorld.h:287
QuestGiverStatus
Definition QuestDef.h:111
@ DIALOG_STATUS_UNAVAILABLE
Definition QuestDef.h:113
@ DIALOG_STATUS_NONE
Definition QuestDef.h:112
@ DIALOG_STATUS_AVAILABLE
Definition QuestDef.h:120
@ DIALOG_STATUS_SCRIPTED_NO_STATUS
Definition QuestDef.h:125
@ DIALOG_STATUS_LOW_LEVEL_REWARD_REP
Definition QuestDef.h:115
@ DIALOG_STATUS_REWARD
Definition QuestDef.h:122
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
Definition QuestDef.h:114
@ DIALOG_STATUS_REWARD_REP
Definition QuestDef.h:118
@ DIALOG_STATUS_INCOMPLETE
Definition QuestDef.h:117
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP
Definition QuestDef.h:116
@ DIALOG_STATUS_AVAILABLE_REP
Definition QuestDef.h:119
int32 GetQuestLevel(Quest const *quest) const
Definition Player.h:1434
bool CanSeeStartQuest(Quest const *quest)
Definition PlayerQuest.cpp:237
uint32 GetQuestId() const
Definition QuestDef.h:228
bool IsDaily() const
Definition QuestDef.h:287
bool IsWeekly() const
Definition QuestDef.h:288
bool IsDailyOrWeekly() const
Definition QuestDef.h:291
bool IsMonthly() const
Definition QuestDef.h:289

References CanSeeStartQuest(), CanTakeQuest(), CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, DIALOG_STATUS_AVAILABLE, DIALOG_STATUS_AVAILABLE_REP, DIALOG_STATUS_INCOMPLETE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP, DIALOG_STATUS_LOW_LEVEL_REWARD_REP, DIALOG_STATUS_NONE, DIALOG_STATUS_REWARD, DIALOG_STATUS_REWARD_REP, DIALOG_STATUS_SCRIPTED_NO_STATUS, DIALOG_STATUS_UNAVAILABLE, Object::GetEntry(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), GetQuestRewardStatus(), GetQuestStatus(), Object::GetTypeId(), Quest::IsAutoComplete(), Quest::IsDaily(), Quest::IsDailyOrWeekly(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SatisfyQuestLevel(), sConditionMgr, sObjectMgr, sScriptMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GameObject::ActivateToQuest(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), and SendQuestGiverStatusMultiple().

◆ GetQuestLevel()

int32 Player::GetQuestLevel ( Quest const *  quest) const
inline

◆ GetQuestRate()

float Player::GetQuestRate ( bool  isDFQuest = false)
16284{
16285 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16286
16287 sScriptMgr->OnGetQuestRate(this, result);
16288
16289 return result;
16290}
@ RATE_XP_QUEST_DF
Definition IWorld.h:477
@ RATE_XP_QUEST
Definition IWorld.h:476

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

Referenced by CalculateQuestRewardXP().

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1496{ return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
@ QUEST_COUNTS_OFFSET
Definition Player.h:629
#define MAX_QUEST_OFFSET
Definition Player.h:633
@ PLAYER_QUEST_LOG_1_1
Definition UpdateFields.h:186

References Object::GetUInt64Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and QUEST_COUNTS_OFFSET.

Referenced by SendQuestUpdateAddCreatureOrGo(), and SendQuestUpdateAddPlayer().

◆ GetQuestSlotQuestId()

◆ GetQuestSlotState()

uint32 Player::GetQuestSlotState ( uint16  slot) const
inline

◆ GetQuestSlotTime()

uint32 Player::GetQuestSlotTime ( uint16  slot) const
inline

◆ GetQuestStatus()

QuestStatus Player::GetQuestStatus ( uint32  quest_id) const
1431{
1432 if (quest_id)
1433 {
1434 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1435
1436 if (itr != m_QuestStatus.end())
1437 {
1438 return itr->second.Status;
1439 }
1440
1441 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1442 {
1443 if (qInfo->IsSeasonal())
1444 {
1446 }
1447
1448 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1449 {
1450 return QUEST_STATUS_REWARDED;
1451 }
1452 }
1453 }
1454
1455 return QUEST_STATUS_NONE;
1456}
@ QUEST_STATUS_REWARDED
Definition QuestDef.h:106

References IsQuestRewarded(), m_QuestStatus, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, SatisfyQuestSeasonal(), and sObjectMgr.

Referenced by GameObject::ActivateToQuest(), LootItem::AllowedForPlayer(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::AttackStart(), CanRewardQuest(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), spell_item_demon_broiled_surprise::CheckRequirement(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), DuelComplete(), Spell::EffectQuestClear(), Spell::EffectScriptEffect(), SmartAI::EndPath(), FailQuest(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), go_gilded_brazier::go_gilded_brazierAI::GossipHello(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), WorldSession::HandleAreaTriggerOpcode(), spell_midsummer_torch_catch::HandleDummy(), spell_q12014_steady_as_a_rock::HandleFinish(), spell_sindragosa_frost_breath::HandleInfusion(), lookup_commandscript::HandleLookupQuestCommand(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), spell_q11322_q11317_the_cleansing::if(), SpellArea::IsFitToRequirements(), npc_kservant::npc_kservantAI::IsSummonedBy(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), npc_a_special_surprise::npc_a_special_surpriseAI::MeetQuestCondition(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), npc_black_knight_graveyard::npc_black_knight_graveyardAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_rizzle_sprysprocket::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_great_bear_spirit::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_plucky::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_iruk::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_tele_to_violet_stand::OnGossipHello(), go_ravager_cage::OnGossipHello(), go_bristlelimb_cage::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_skull_pile::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_table_theka::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_amberpine_outhouse::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_great_bear_spirit::OnGossipSelect(), at_ancient_leaf::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), at_malfurion_stormrage::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_captured_frog::OnUse(), npc_doctor::npc_doctorAI::PatientDied(), npc_doctor::npc_doctorAI::PatientSaved(), PrepareQuestMenu(), NPCStaveQuestAI::QuestIncomplete(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), SatisfyQuestExclusiveGroup(), SatisfyQuestNextChain(), SatisfyQuestPreviousQuest(), SatisfyQuestStatus(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), npc_costumed_orphan_matron::sGossipHello(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), Battleground::SpiritOfCompetitionEvent(), npc_clintar_spirit::npc_clintar_spiritAI::StartEvent(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1635{ return m_QuestStatusSave; }

References m_QuestStatusSave.

◆ GetRaidDifficulty()

◆ GetRandomWinner()

bool Player::GetRandomWinner ( )
inline

◆ GetRank()

uint8 Player::GetRank ( ) const
inline

◆ GetRatingBonusValue()

◆ GetRatingMultiplier()

float Player::GetRatingMultiplier ( CombatRating  cr) const
5204{
5205 uint8 level = GetLevel();
5206
5207 if (level > GT_MAX_LEVEL)
5208 level = GT_MAX_LEVEL;
5209
5210 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5211 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5212 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5213 if (!Rating || !classRating)
5214 return 1.0f; // By default use minimum coefficient (not must be called)
5215
5216 return classRating->ratio / Rating->ratio;
5217}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition DBCStructure.h:1038
Definition DBCStructure.h:1046
float ratio
Definition DBCStructure.h:1047
Definition DBCStructure.h:1076
float ratio
Definition DBCStructure.h:1077

References Unit::getClass(), Unit::GetLevel(), GT_MAX_LEVEL, GT_MAX_RATING, GtCombatRatingsEntry::ratio, GtOCTClassCombatRatingScalarEntry::ratio, sGtCombatRatingsStore, and sGtOCTClassCombatRatingScalarStore.

Referenced by ApplyRatingMod(), and GetRatingBonusValue().

◆ GetRealDodge()

float Player::GetRealDodge ( ) const
inline
2616{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

float Player::GetRealParry ( ) const
inline
2615{ return m_realParry; }

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15376{
15377 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15378}
int32 GetReputation(uint32 faction_id) const
Definition ReputationMgr.cpp:78

References ReputationMgr::GetReputation(), GetReputationMgr(), and sFactionStore.

Referenced by CanCompleteQuest(), ReputationChanged(), ReputationChanged2(), and SatisfyQuestReputation().

◆ GetReputationMgr() [1/2]

◆ GetReputationMgr() [2/2]

ReputationMgr const & Player::GetReputationMgr ( ) const
inline
2134{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12379{
12380 if (!factionTemplate || !factionTemplate->faction)
12381 {
12382 return 1.0f;
12383 }
12384
12385 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12386 if (rank <= REP_NEUTRAL)
12387 {
12388 return 1.0f;
12389 }
12390
12391 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12392}
ReputationRank
Definition SharedDefines.h:179
@ REP_NEUTRAL
Definition SharedDefines.h:183

References FactionTemplateEntry::faction, GetReputationRank(), and REP_NEUTRAL.

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1752{
1753 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1754 if (!qInfo)
1755 return 0;
1756
1757 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1758 if (qInfo->RequiredNpcOrGo[j] == entry)
1759 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1760
1761 return 0;
1762}

References m_QuestStatus, QUEST_OBJECTIVES_COUNT, Quest::RequiredNpcOrGo, and sObjectMgr.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), and npc_razael_and_lyana::OnGossipHello().

◆ GetRestBonus()

float Player::GetRestBonus ( ) const
inline
1211{ return _restBonus; }

References _restBonus.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12650{
12651 // search priceless resurrection possibilities
12652 uint32 prio = 0;
12653 uint32 spell_id = 0;
12655 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12656 {
12657 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12658 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12659 {
12660 switch ((*itr)->GetId())
12661 {
12662 case 20707:
12663 spell_id = 3026;
12664 break; // rank 1
12665 case 20762:
12666 spell_id = 20758;
12667 break; // rank 2
12668 case 20763:
12669 spell_id = 20759;
12670 break; // rank 3
12671 case 20764:
12672 spell_id = 20760;
12673 break; // rank 4
12674 case 20765:
12675 spell_id = 20761;
12676 break; // rank 5
12677 case 27239:
12678 spell_id = 27240;
12679 break; // rank 6
12680 case 47883:
12681 spell_id = 47882;
12682 break; // rank 7
12683 default:
12684 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12685 continue;
12686 }
12687
12688 prio = 3;
12689 }
12690 // Twisting Nether // prio: 2 (max)
12691 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12692 {
12693 prio = 2;
12694 spell_id = 23700;
12695 }
12696 }
12697
12698 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12699 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12700 spell_id = 21169;
12701
12702 return spell_id;
12703}
bool roll_chance_i(int chance)
Definition Random.h:59
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References Unit::GetAuraEffectsByType(), Unit::HasAura(), HasItemCount(), HasSpell(), HasSpellCooldown(), LOG_ERROR, roll_chance_i(), and SPELL_AURA_DUMMY.

Referenced by Unit::Kill(), and setDeathState().

◆ GetRewardedQuestCount()

std::size_t Player::GetRewardedQuestCount ( ) const
inline
1637{ return m_RewardedQuests.size(); }

References m_RewardedQuests.

Referenced by WorldSession::HandleQueryQuestsCompleted().

◆ getRewardedQuests()

RewardedQuestSet const & Player::getRewardedQuests ( ) const
inline

◆ GetRuneBaseCooldown()

uint32 Player::GetRuneBaseCooldown ( uint8  index,
bool  skipGrace 
)
13410{
13411 uint8 rune = GetBaseRune(index);
13412 uint32 cooldown = RUNE_BASE_COOLDOWN;
13413 if (!skipGrace)
13414 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13415
13417 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13418 {
13419 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13420 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13421 }
13422
13423 return cooldown;
13424}
@ RUNE_BASE_COOLDOWN
Definition Player.h:407
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition SpellAuraDefines.h:173
uint32 GetGracePeriod(uint8 index) const
Definition Player.h:2517
RuneType GetBaseRune(uint8 index) const
Definition Player.h:2514

References Unit::GetAuraEffectsByType(), GetBaseRune(), GetGracePeriod(), POWER_RUNE, RUNE_BASE_COOLDOWN, and SPELL_AURA_MOD_POWER_REGEN_PERCENT.

Referenced by Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetRuneCooldown()

uint32 Player::GetRuneCooldown ( uint8  index) const
inline

◆ GetRunesState()

uint8 Player::GetRunesState ( ) const
inline
2513{ return m_runes->runeState; }
uint8 runeState
Definition Player.h:433

References m_runes, and Runes::runeState.

Referenced by Spell::EffectActivateRune(), and Spell::TakeRunePower().

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2601{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition Player.h:2602

References m_drwGUID.

◆ GetSaveTimer()

uint32 Player::GetSaveTimer ( ) const
inline
2363{ return m_nextSave; }

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11585{
11586 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11587 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11588
11589 return nullptr;
11590}
@ UNIT_FIELD_TARGET
Definition UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition ObjectAccessor.cpp:220

References Object::GetGuidValue(), ObjectAccessor::GetPlayer(), and UNIT_FIELD_TARGET.

Referenced by Acore::ChatCommands::PlayerIdentifier::FromTarget().

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

time_t Player::GetSemaphoreTeleportFar ( ) const
inline
2104{ return mSemaphoreTeleport_Far; }

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

time_t Player::GetSemaphoreTeleportNear ( ) const
inline
2103{ return mSemaphoreTeleport_Near; }

References mSemaphoreTeleport_Near.

◆ GetSession()

WorldSession * Player::GetSession ( ) const
inline
2005{ return m_session; }

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Pet::_LoadSpellCooldowns(), Battleground::_ProcessProgress(), _SaveCharacter(), _SaveInstanceTimeRestrictions(), _StoreOrEquipNewItem(), ActivateSpec(), ActivateTaxiPathTo(), AddEnchantmentDuration(), AddItem(), Guild::AddMember(), InstanceMap::AddPlayerToMap(), AddRunePower(), addSpell(), Channel::Announce(), ApplyEquipCooldown(), TotemAI::AttackStart(), AutoUnequipOffhandIfNeed(), BanMgr::BanCharacter(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), BindToInstance(), Group::BroadcastPacket(), Group::BroadcastReadyCheck(), SocialMgr::BroadcastToFriendListers(), BuildPlayerRepop(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), BattlegroundSA::CaptureGraveyard(), CharacterActionIpLogger::CharacterIPLogAction(), CharmSpellInitialize(), Spell::CheckCast(), CheckDuelDistance(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckRequiredBosses(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), ConvertRune(), Create(), Guild::Create(), ArenaTeam::DelMember(), Object::DestroyForPlayer(), Group::Disband(), InstanceScript::DoSendNotifyToInstance(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectDuel(), Spell::EffectPlaySound(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), BattlegroundSA::EventPlayerDamagedGO(), BGQueueInviteEvent::Execute(), SendEncounterUnit::Execute(), ExecuteOrCancelSpellCastRequest(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), GetAurasForTarget(), ChannelMgr::GetChannel(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), Group::GroupLoot(), WorldSession::HandleAcceptGrantLevel(), WorldSession::HandleAcceptTradeOpcode(), account_commandscript::HandleAccountSetAddonCommand(), account_commandscript::HandleAccountSetGmLevelCommand(), spell_madrigosa_activate_barrier::HandleActivateObject(), spell_madrigosa_deactivate_barrier::HandleActivateObject(), WorldSession::HandleAddFriendOpcode(), misc_commandscript::HandleAddItemCommand(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), AuraEffect::HandleAuraOpenStable(), AuraEffect::HandleAuraSetVehicle(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleBeginTradeOpcode(), character_commandscript::HandleCharacterLevel(), WorldSession::HandleChatIgnoredOpcode(), debug_commandscript::HandleDebugSendOpcodeCommand(), spell_gen_spirit_healer_res::HandleDummy(), cheat_commandscript::HandleExploreCheatCommand(), ticket_commandscript::HandleGMTicketUnAssignCommand(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupDeclineOpcode(), WorldSession::HandleGroupInviteOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), lookup_commandscript::HandleLookupPlayerIpCommand(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMessagechatOpcode(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyGenderCommand(), modify_commandscript::HandleModifyHPCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyMoneyCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), modify_commandscript::HandleModifySpellCommand(), WorldSession::HandleMovementOpcodes(), misc_commandscript::HandleMuteCommand(), WorldSession::HandleOfferPetitionOpcode(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_the_flag_of_ownership::HandleScript(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMessageCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), cheat_commandscript::HandleTaxiCheatCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnmuteCommand(), WorldSession::HandleWhoisOpcode(), WorldSession::HandleWhoOpcode(), ChatHandler::HasLowerSecurity(), hasSpanishClient(), lfg::LFGMgr::InitializeLockedDungeons(), InitTalentForLevel(), BattlegroundQueue::InviteGroupToBG(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), isBeingLoaded(), IsNeverVisible(), IsPetNeedBeTemporaryUnsummoned(), ObjectMgr::IsVendorItemValid(), IsVisibleGloballyFor(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), Channel::JoinNotify(), Unit::JumpTo(), Channel::KickOrBan(), Unit::KnockbackFrom(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), GameObject::ModifyHealth(), ModifySpellCooldown(), Group::NeedBeforeGreed(), go_tele_to_dalaran_crystal::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), npc_augustus_the_touched::OnGossipSelect(), npc_rivern_frostwind::OnGossipSelect(), npc_roxi_ramrocket::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_wg_quest_giver::OnGossipSelect(), npc_drake_dealer_hurlunk::OnGossipSelect(), npc_shattrathflaskvendors::OnGossipSelect(), npc_slim::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_prof_leather::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), OnGossipSelect(), ServerMailReward::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerLeaveWar(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), Channel::Password(), Unit::PatchValuesUpdate(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), PossessSpellInitialize(), BattlegroundSA::PostUpdateImpl(), PrepareGossipMenu(), PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ProhibitSpellSchool(), Battleground::ReadyMarkerClicked(), RefundItem(), Group::RemoveMember(), RemovePet(), RemovePetitionsAndSigns(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), Group::ResetMaxEnchantingLevel(), ResurrectPlayer(), ResyncRunes(), RewardHonor(), Satisfy(), SatisfyQuestLog(), SaveToDB(), SendActionButtons(), npc_prof_alchemy::SendActionMenu(), npc_prof_blacksmith::SendActionMenu(), npc_prof_tailor::SendActionMenu(), AchievementMgr::SendAllAchievementData(), BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(), Battlefield::SendAreaSpiritHealerQueryOpcode(), SendAttackSwingBadFacingAttack(), SendAttackSwingCancelAttack(), SendAttackSwingCantAttack(), SendAttackSwingDeadTarget(), SendAttackSwingNotInRange(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), SendBuyError(), SendCanTakeQuestResponse(), Spell::SendCastResult(), Spell::SendCastResult(), SendCorpseReclaimDelay(), SendDuelCountdown(), SendDungeonDifficulty(), SendEnchantmentDurations(), SendEquipError(), SendEquipmentSetList(), SendExplorationExperience(), SocialMgr::SendFriendStatus(), ChatHandler::SendGMText(), ChatHandler::SendGMText(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), SendInitialSpells(), Map::SendInitTransports(), SendInitWorldStates(), BattlefieldWG::SendInitWorldStatesTo(), SendInstanceResetWarning(), BattlegroundQueue::SendJoinMessageArenaQueue(), SendLearnPacket(), lfg::LFGMgr::SendLfgRoleChosen(), SendLogXPGain(), Group::SendLootAllPassed(), Group::SendLootRoll(), Group::SendLootRollWon(), Group::SendLootStartRoll(), Group::SendLootStartRollToPlayer(), SendMailResult(), MailDraft::SendMailTo(), BattlegroundQueue::SendMessageBGQueue(), SendNewItem(), SendNewMail(), CreatureTextMgr::SendNonChatPacket(), AutobroadcastMgr::SendNotificationAnnouncement(), SendNotifyLootItemRemoved(), SendNotifyLootMoneyRemoved(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SendPetActionFeedback(), Unit::SendPetAIReaction(), Spell::SendPetCastResult(), Unit::SendPetTalk(), WorldObject::SendPlayMusic(), SendPreparedQuest(), SendProficiency(), SendPushToPartyResponse(), SendQuestComplete(), SendQuestConfirmAccept(), SendQuestFailed(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestTimerFailed(), SendQuestUpdateAddCreatureOrGo(), SendQuestUpdateAddItem(), SendQuestUpdateAddPlayer(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendRaidDifficulty(), SendRaidInfo(), SendRefundInfo(), SendRemoveControlBar(), Map::SendRemoveTransports(), SendResetFailedNotify(), SendResetInstanceFailed(), SendResetInstanceSuccess(), AchievementMgr::SendRespondInspectAchievements(), Spell::SendResurrectRequest(), SendSavedInstances(), SendSellError(), PlayerSocial::SendSocialList(), SendSystemMessage(), SendTalentsInfoData(), SendTalentWipeConfirm(), SendTeleportAckPacket(), Item::SendTimeUpdate(), Acore::VisibleNotifier::SendToSelf(), SendTransferAborted(), BattlegroundSA::SendTransportInit(), BattlegroundSA::SendTransportsRemove(), Item::SendUpdateSockets(), Group::SendUpdateToPlayer(), Object::SendUpdateToPlayer(), ReputationMgr::SendVisible(), AutobroadcastMgr::SendWorldAnnouncement(), ChatHandler::SendWorldText(), ChatHandler::SendWorldText(), ChatHandler::SendWorldTextOptional(), ChatHandler::SendWorldTextOptional(), TradeData::SetAccepted(), SetBindPoint(), SetClientControl(), Item::SetEnchantment(), SetEquipmentSet(), SetGameMaster(), SetGMVisible(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetStandState(), Guild::Member::SetStats(), SetTitle(), Channel::ShouldAnnouncePlayer(), SpawnCorpseBones(), SummonPet(), lfg::LFGMgr::TeleportPlayer(), TeleportTo(), Channel::ToggleModeration(), TradeCancel(), Channel::UnBan(), AuctionHouseSearcher::Update(), TradeData::Update(), Map::Update(), Pet::Update(), GameObject::Update(), Update(), PetAI::UpdateAI(), UpdateForQuestWorldObjects(), UpdateHomebindTime(), UpdateLocalChannels(), Group::UpdatePlayerOutOfRange(), UpdatePosition(), UpdateSpeakTime(), UpdateTriggerVisibility(), GameObject::Use(), VehicleSpellInitialize(), Whisper(), Unit::Whisper(), Unit::Whisper(), and Whisper().

◆ GetShield()

Item * Player::GetShield ( bool  useable = false) const
524{
525 Item* item = nullptr;
526 if (useable)
528 else
530 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
531 return nullptr;
532
533 if (!useable)
534 return item;
535
536 if (item->IsBroken())
537 return nullptr;
538
539 return item;
540}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1261

References ItemTemplate::Class, EQUIPMENT_SLOT_OFFHAND, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), and ITEM_CLASS_ARMOR.

Referenced by AuraEffect::CalculateAmount().

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

5108{
5110
5111 value = (value < 0) ? 0 : value;
5112
5113 return uint32(value);
5114}

References FLAT_MOD, Unit::GetStat(), m_auraBaseMod, PCT_MOD, SHIELD_BLOCK_VALUE, and STAT_STRENGTH.

Referenced by UpdateShieldBlockValue().

◆ GetSightRange()

float Player::GetSightRange ( WorldObject const *  target = nullptr) const
overridevirtual

Reimplemented from WorldObject.

16322{
16323 float sightRange = WorldObject::GetSightRange(target);
16325 {
16326 sightRange += *_farSightDistance;
16327 }
16328
16329 return sightRange;
16330}
virtual float GetSightRange(WorldObject const *target=nullptr) const
Definition Object.cpp:1683

References _farSightDistance, and WorldObject::GetSightRange().

Referenced by Group::UpdatePlayerOutOfRange(), and UpdateVisibilityForPlayer().

◆ GetSkillPermBonusValue()

int16 Player::GetSkillPermBonusValue ( uint32  skill) const
5549{
5550 if (!skill)
5551 return 0;
5552
5553 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5554 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5555 return 0;
5556
5558}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_PERM_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillStatusMap() [1/2]

SkillStatusMap & Player::GetSkillStatusMap ( )
inline
1787{ return mSkillStatus; }

References mSkillStatus.

◆ GetSkillStatusMap() [2/2]

SkillStatusMap const & Player::GetSkillStatusMap ( ) const
inline
1786{ return mSkillStatus; }

References mSkillStatus.

Referenced by WorldSession::HandleAuctionListItems().

◆ GetSkillStep()

uint16 Player::GetSkillStep ( uint16  skill) const
5460{
5461 if (!skill)
5462 return 0;
5463
5464 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5465 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5466 return 0;
5467
5468 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5469}
uint16 PAIR32_HIPART(uint32 x)
Definition ObjectDefines.h:92

References Object::GetUInt32Value(), mSkillStatus, PAIR32_HIPART(), PLAYER_SKILL_INDEX, and SKILL_DELETED.

Referenced by learn_commandscript::HandleLearnAllRecipesCommand(), and misc_commandscript::HandleSetSkillCommand().

◆ GetSkillTempBonusValue()

int16 Player::GetSkillTempBonusValue ( uint32  skill) const
5561{
5562 if (!skill)
5563 return 0;
5564
5565 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5566 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5567 return 0;
5568
5570}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_TEMP_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillValue()

◆ GetSocial()

◆ GetSpec()

uint32 Player::GetSpec ( int8  spec = -1)
16048{
16049 uint32 mostTalentTabId = 0;
16050 uint32 mostTalentCount = 0;
16051 uint32 specIdx = 0;
16052
16053 if (m_specsCount) // not all instances of Player have a spec for some reason
16054 {
16055 if (spec < 0)
16056 specIdx = m_activeSpec;
16057 else
16058 specIdx = spec;
16059 // find class talent tabs (all players have 3 talent tabs)
16060 uint32 const* talentTabIds = GetTalentTabPages(getClass());
16061
16062 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
16063 {
16064 uint32 talentCount = 0;
16065 uint32 talentTabId = talentTabIds[i];
16066 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
16067 {
16068 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
16069 if (!talentInfo)
16070 continue;
16071
16072 // skip another tab talents
16073 if (talentInfo->TalentTab != talentTabId)
16074 continue;
16075
16076 // find max talent rank (0~4)
16077 int8 curtalent_maxrank = -1;
16078 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
16079 {
16080 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
16081 {
16082 curtalent_maxrank = rank;
16083 break;
16084 }
16085 }
16086
16087 // not learned talent
16088 if (curtalent_maxrank < 0)
16089 continue;
16090
16091 talentCount += curtalent_maxrank + 1;
16092 }
16093
16094 if (mostTalentCount < talentCount)
16095 {
16096 mostTalentCount = talentCount;
16097 mostTalentTabId = talentTabId;
16098 }
16099 }
16100 }
16101 return mostTalentTabId;
16102}
uint32 const * GetTalentTabPages(uint8 cls)
Definition DBCStores.cpp:824
#define MAX_TALENT_TABS
Definition DBCStructure.h:1919

References Unit::getClass(), GetTalentTabPages(), HasTalent(), m_activeSpec, m_specsCount, MAX_TALENT_RANK, MAX_TALENT_TABS, TalentEntry::RankID, sTalentStore, and TalentEntry::TalentTab.

Referenced by HasCasterSpec(), HasHealSpec(), HasMeleeSpec(), and HasTankSpec().

◆ GetSpecsCount()

uint8 Player::GetSpecsCount ( ) const
inline

◆ GetSpellByProto()

uint32 Player::GetSpellByProto ( ItemTemplate proto)

◆ GetSpellCooldownDelay()

uint32 Player::GetSpellCooldownDelay ( uint32  spell_id) const
16382{
16383 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16384 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16385}
uint32 getMSTime()
Definition Timer.h:103

References getMSTime(), and m_spellCooldowns.

Referenced by CanExecutePendingSpellCastRequest(), CanRequestSpellCast(), Aura::HandleAuraSpecificMods(), npc_brewfest_keg_reciver::MoveInLineOfSight(), and ProhibitSpellSchool().

◆ GetSpellCooldownMap() [1/2]

SpellCooldowns & Player::GetSpellCooldownMap ( )
inline
1784{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

SpellCooldowns Player::GetSpellCooldowns ( ) const
inline
2176{ return m_spellCooldowns; }

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5187{
5188 uint8 level = GetLevel();
5189 uint32 pclass = getClass();
5190
5191 if (level > GT_MAX_LEVEL)
5192 level = GT_MAX_LEVEL;
5193
5194 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5195 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5196 if (!critBase || !critRatio)
5197 return 0.0f;
5198
5199 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5200 return crit * 100.0f;
5201}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition DBCStructure.h:1061
float base
Definition DBCStructure.h:1062
Definition DBCStructure.h:1071
float ratio
Definition DBCStructure.h:1072

References GtChanceToSpellCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToSpellCritEntry::ratio, sGtChanceToSpellCritBaseStore, sGtChanceToSpellCritStore, and STAT_INTELLECT.

Referenced by UpdateSpellCritChance().

◆ GetSpellMap() [1/2]

PlayerSpellMap & Player::GetSpellMap ( )
inline
1781{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

SpellModList const & Player::GetSpellModList ( uint32  type) const
inline
2620{ return m_spellMods[type]; }

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetSpellQueueWindow()

uint32 Player::GetSpellQueueWindow ( ) const
protected
2299{
2300 return sWorld->getIntConfig(CONFIG_SPELL_QUEUE_WINDOW);
2301}
@ CONFIG_SPELL_QUEUE_WINDOW
Definition IWorld.h:423

References CONFIG_SPELL_QUEUE_WINDOW, and sWorld.

Referenced by CanExecutePendingSpellCastRequest(), and CanRequestSpellCast().

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12729{
12730 bool recruitAFriend = false;
12731 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12732 {
12733 if (Group* group = this->GetGroup())
12734 {
12735 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12736 {
12737 Player* player = itr->GetSource();
12738 if (!player || !player->IsInMap(this))
12739 continue;
12740
12741 if (!player->IsAtRecruitAFriendDistance(this))
12742 continue; // member (alive or dead) or his corpse at req. distance
12743
12744 if (forXP)
12745 {
12746 // level must be allowed to get RaF bonus
12747 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12748 continue;
12749
12750 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12751 if (player->GetLevel() < GetLevel())
12753 continue;
12754 }
12755
12756 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12757 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12758 if (ARecruitedB || BRecruitedA)
12759 {
12760 recruitAFriend = true;
12761 break;
12762 }
12763 }
12764 }
12765 }
12766 return recruitAFriend;
12767}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition IWorld.h:247
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition IWorld.h:248
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition Player.cpp:12838
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1296
uint32 GetRecruiterId() const
Definition WorldSession.h:540

References CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, WorldSession::GetAccountId(), GetGroup(), Unit::GetLevel(), WorldSession::GetRecruiterId(), GetSession(), IsAtRecruitAFriendDistance(), WorldObject::IsInMap(), and sWorld.

Referenced by CalculateReputationGain(), GiveXP(), and SetRestBonus().

◆ GetStartPosition()

WorldLocation Player::GetStartPosition ( ) const
11441{
11442 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11443 uint32 mapId = info->mapId;
11445 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11446 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11447}

References CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, Unit::getClass(), Unit::getRace(), HasSpell(), IsClass(), PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, and sObjectMgr.

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1930{ return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map

References m_raidMapDifficulty.

Referenced by SendInitialPacketsAfterAddToMap().

◆ GetSubGroup()

uint8 Player::GetSubGroup ( ) const
inline

◆ GetSummonExpireTimer()

time_t Player::GetSummonExpireTimer ( ) const
inline
1118{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15319{
15320 const PlayerTalentMap& talentMap = GetTalentMap();
15321 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15322 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15323 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15324 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15325 if (tab->tabpage < 3)
15326 {
15327 // find current talent rank
15328 uint8 currentTalentRank = 0;
15329 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15330 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15331 {
15332 currentTalentRank = rank + 1;
15333 break;
15334 }
15335 specPoints[tab->tabpage] += currentTalentRank;
15336 }
15337}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

Referenced by lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTeamId()

TeamId Player::GetTeamId ( bool  original = false) const
inline
2116{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5864

References Unit::getRace(), m_team, and TeamIdForRace().

Referenced by ActivateTaxiPathTo(), GameObject::ActivateToQuest(), BattlegroundQueue::AddGroup(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), InstanceMap::AddPlayerToMap(), npc_love_in_air_snivel::AllowAction(), BattlegroundSA::AllowDefenseOfTheAncients(), LootItem::AllowedForPlayer(), Battlefield::AskToLeaveQueue(), SocialMgr::BroadcastToFriendListers(), WorldState::BuffMagtheridonTeam(), Corpse::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_steam_powered_auctioneer::npc_steam_powered_auctioneerAI::CanBeSeen(), npc_mei_francis_mount::npc_mei_francis_mountAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), OPvPCapturePointZM_GraveYard::CanTalkTo(), CanUseItem(), BattlegroundSA::CaptureGraveyard(), ContinueTaxiFlight(), BattlegroundSA::DefendersPortalTeleport(), WorldState::DispelMagtheridonTeam(), BattlegroundIC::DoAction(), DuelComplete(), Spell::EffectTeleportUnits(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundIC::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), BattlegroundAV::EventPlayerDefendsPoint(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundSA::EventPlayerUsedGO(), GetBgTeamId(), Battlefield::GetClosestGraveyard(), BattlegroundAB::GetClosestGraveyard(), BattlegroundAV::GetClosestGraveyard(), BattlegroundEY::GetClosestGraveyard(), BattlegroundIC::GetClosestGraveyard(), BattlegroundSA::GetClosestGraveyard(), BattlegroundWS::GetClosestGraveyard(), SocialMgr::GetFriendInfo(), Battleground::GetRealRepFactionForPlayer(), Guild::HandleAcceptMember(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), BattlegroundEY::HandleAreaTrigger(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleArenaTeamAcceptOpcode(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleCalendarEventInvite(), OutdoorPvPSI::HandleDropFlag(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), BattlefieldWG::HandleKill(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundAV::HandleKillPlayer(), BattlegroundIC::HandleKillPlayer(), BattlegroundAV::HandleKillUnit(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleOfferPetitionOpcode(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), Battlefield::HandlePlayerEnterZone(), OutdoorPvP::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldState::HandlePlayerEnterZone(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), WorldState::HandlePlayerLeaveZone(), BattlegroundIC::HandlePlayerResurrect(), BattlegroundAV::HandleQuestComplete(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), WorldSession::HandleSendMail(), WorldSession::HandleWhoOpcode(), Battlefield::HasPlayer(), OutdoorPvP::HasPlayer(), lfg::LFGMgr::InitializeLockedDungeons(), Channel::Invite(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), SpellArea::IsFitToRequirements(), IsGroupVisibleFor(), BfCapturePoint::IsInsideObjective(), OPvPCapturePoint::IsInsideObjective(), lfg::LFGMgr::JoinRaidBrowser(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), Unit::Kill(), lfg::LFGMgr::LfrSearchAdd(), lfg::LFGMgr::LfrSearchRemove(), lfg::LFGMgr::LfrSetComment(), LoadFromDB(), AchievementCriteriaData::Meets(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_not_even_a_scratch::OnCheck(), BattlefieldWG::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_spirit_guide::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), lfg::LFGPlayerScript::OnLogin(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnPlayerEnter(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), BattlefieldWG::OnPlayerJoinWar(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), AreaTrigger_at_legion_teleporter::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::PassengerBoarded(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), RepopAtGraveyard(), ReportedAfkBy(), RewardHonor(), RewardReputation(), Satisfy(), AchievementMgr::SendAchievementEarned(), WorldSession::SendListInventory(), SendLoot(), Acore::MessageDistDeliverer::SendPacket(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), ObjectMgr::SendServerMail(), WorldSession::SendSpiritResurrect(), SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), Creature::SendZoneUnderAttackMessage(), spell_item_recall::SetDest(), SetEntryPoint(), SetFactionForRace(), Channel::SetMode(), Channel::SetOwner(), npc_midsummer_torch_target::SpellHit(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), UpdateLFGChannel(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

WorldLocation & Player::GetTeleportDest ( )
inline

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
5094{
5095 if (modGroup >= BASEMOD_END)
5096 {
5097 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
5098 return 0.0f;
5099 }
5100
5101 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5102 return 0.0f;
5103
5104 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
5105}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2204{ return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }

References FLAT_MOD, m_auraBaseMod, and PCT_MOD.

Referenced by UpdateCritPercentage().

◆ GetTotalPlayedTime()

◆ GetTradeData()

◆ GetTrader()

Player * Player::GetTrader ( ) const
inline
1386{ return m_trade ? m_trade->GetTrader() : nullptr; }
Player * GetTrader() const
Definition TradeData.h:41

References TradeData::GetTrader(), and m_trade.

Referenced by WorldSession::moveItems(), and UpdatePosition().

◆ GetTrainerSpellState()

TrainerSpellState Player::GetTrainerSpellState ( TrainerSpell const *  trainer_spell) const
3911{
3912 if (!trainer_spell)
3913 return TRAINER_SPELL_RED;
3914
3915 bool hasSpell = true;
3916 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3917 {
3918 if (!trainer_spell->learnedSpell[i])
3919 continue;
3920
3921 if (!HasSpell(trainer_spell->learnedSpell[i]))
3922 {
3923 hasSpell = false;
3924 break;
3925 }
3926 }
3927 // known spell
3928 if (hasSpell)
3929 return TRAINER_SPELL_GRAY;
3930
3931 // check skill requirement
3932 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3933 return TRAINER_SPELL_RED;
3934
3935 // check level requirement
3936 if (GetLevel() < trainer_spell->reqLevel)
3937 return TRAINER_SPELL_RED;
3938
3939 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3940 {
3941 if (!trainer_spell->learnedSpell[i])
3942 continue;
3943
3944 // check race/class requirement
3945 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3946 return TRAINER_SPELL_RED;
3947
3948 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3949 {
3950 // check prev.rank requirement
3951 if (prevSpell && !HasSpell(prevSpell))
3952 return TRAINER_SPELL_RED;
3953 }
3954
3955 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3956 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3957 {
3958 // check additional spell requirement
3959 if (!HasSpell(itr->second))
3960 return TRAINER_SPELL_RED;
3961 }
3962 }
3963
3964 // check primary prof. limit
3965 // first rank of primary profession spell when there are no proffesions avalible is disabled
3966 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3967 {
3968 if (!trainer_spell->learnedSpell[i])
3969 continue;
3970 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3971 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3973 }
3974
3975 return TRAINER_SPELL_GREEN;
3976}
@ TRAINER_SPELL_GREEN
Definition Player.h:213
@ TRAINER_SPELL_GRAY
Definition Player.h:215
@ TRAINER_SPELL_GREEN_DISABLED
Definition Player.h:216
@ TRAINER_SPELL_RED
Definition Player.h:214
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition SpellMgr.h:570
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition Player.cpp:12394

References GetBaseSkillValue(), GetFreePrimaryProfessionPoints(), Unit::GetLevel(), HasSpell(), SpellInfo::IsPrimaryProfessionFirstRank(), IsSpellFitByClassAndRace(), TrainerSpell::learnedSpell, MAX_SPELL_EFFECTS, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, sSpellMgr, TRAINER_SPELL_GRAY, TRAINER_SPELL_GREEN, TRAINER_SPELL_GREEN_DISABLED, and TRAINER_SPELL_RED.

Referenced by WorldSession::HandleTrainerBuySpellOpcode(), and WorldSession::SendTrainerList().

◆ GetUseableItemByPos()

Item * Player::GetUseableItemByPos ( uint8  bag,
uint8  slot 
) const
inline

◆ GetViewpoint()

WorldObject * Player::GetViewpoint ( ) const
13253{
13255 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13256 return nullptr;
13257}
@ TYPEMASK_SEER
Definition ObjectGuid.h:54
Definition Object.h:410
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const guid, uint32 typemask)
Definition ObjectAccessor.cpp:141

References Object::GetGuidValue(), ObjectAccessor::GetObjectByTypeMask(), PLAYER_FARSIGHT, and TYPEMASK_SEER.

Referenced by CinematicMgr::EndCinematic(), WorldSession::HandleFarSightOpcode(), ArenaSpectator::HandleSpectatorWatchCommand(), RemoveFromWorld(), StopCastingBindSight(), and Map::Update().

◆ GetWeaponForAttack()

Item * Player::GetWeaponForAttack ( WeaponAttackType  attackType,
bool  useable = false 
) const
489{
490 uint8 slot;
491 switch (attackType)
492 {
493 case BASE_ATTACK:
495 break;
496 case OFF_ATTACK:
498 break;
499 case RANGED_ATTACK:
501 break;
502 default:
503 return nullptr;
504 }
505
506 Item* item = nullptr;
507 if (useable)
509 else
511 if (!item || item->GetTemplate()->Class != ITEM_CLASS_WEAPON)
512 return nullptr;
513
514 if (!useable)
515 return item;
516
517 if (item->IsBroken() || IsInFeralForm())
518 return nullptr;
519
520 return item;
521}

References BASE_ATTACK, ItemTemplate::Class, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), Unit::IsInFeralForm(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by AuraEffect::CalculateAmount(), CheckAmmoCompatibility(), Spell::CheckItems(), Spell::EffectEnchantItemTmp(), Spell::EffectWeaponDmg(), Unit::GetAPMultiplier(), GetBaseWeaponSkillValue(), GetMeleeDamageSchoolMask(), AuraEffect::HandleAuraModWeaponCritPercent(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), HasWeapon(), HasWeaponForAttack(), SetRegularAttackTime(), SetSheath(), Spell::Spell(), boss_viscidus::SpellHit(), Spell::TakeAmmo(), UpdateExpertise(), UpdateWeaponSkill(), and Spell::WriteAmmoToPacket().

◆ GetWeaponProficiency()

uint32 Player::GetWeaponProficiency ( ) const
inline
1371{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8897{
8898 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8899
8900 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8901 rested_bonus = xp;
8902
8903 SetRestBonus(GetRestBonus() - rested_bonus);
8904
8905 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8906 return rested_bonus;
8907}
void SetRestBonus(float restBonusNew)
Definition Player.cpp:10236
float GetRestBonus() const
Definition Player.h:1211

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6352{
6353 ObjectGuid::LowType guidLow = guid.GetCounter();
6354
6356 stmt->SetData(0, guidLow);
6357 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6358
6359 if (!result)
6360 return 0;
6361
6362 Field* fields = result->Fetch();
6363 uint32 zone = fields[0].Get<uint16>();
6364
6365 if (!zone)
6366 {
6367 // stored zone is zero, use generic and slow zone detection
6368 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6369 stmt->SetData(0, guidLow);
6370 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6371
6372 if (!posResult)
6373 {
6374 return 0;
6375 }
6376
6377 fields = posResult->Fetch();
6378 uint32 map = fields[0].Get<uint16>();
6379 float posx = fields[1].Get<float>();
6380 float posy = fields[2].Get<float>();
6381 float posz = fields[3].Get<float>();
6382
6383 if (!sMapStore.LookupEntry(map))
6384 return 0;
6385
6386 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6387
6388 if (zone > 0)
6389 {
6390 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6391
6392 stmt->SetData(0, uint16(zone));
6393 stmt->SetData(1, guidLow);
6394
6395 CharacterDatabase.Execute(stmt);
6396 }
6397 }
6398
6399 return zone;
6400}
@ CHAR_SEL_CHAR_POSITION_XYZ
Definition CharacterDatabase.h:53
@ CHAR_UPD_ZONE
Definition CharacterDatabase.h:294
@ CHAR_SEL_CHAR_ZONE
Definition CharacterDatabase.h:51

References CHAR_SEL_CHAR_POSITION_XYZ, CHAR_SEL_CHAR_ZONE, CHAR_UPD_ZONE, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), PHASEMASK_NORMAL, PreparedStatementBase::SetData(), sMapMgr, and sMapStore.

Referenced by Guild::Member::LoadFromDB().

◆ GiveLevel()

void Player::GiveLevel ( uint8  level)
Todo:
find some better solution
2471{
2472 uint8 oldLevel = GetLevel();
2473 if (level == oldLevel)
2474 return;
2475
2476 if (Guild* guild = GetGuild())
2477 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2478
2479 PlayerLevelInfo info;
2480 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2481
2482 PlayerClassLevelInfo classInfo;
2483 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2484
2486 packet.Level = level;
2487 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2488
2490 // for (int i = 0; i < MAX_POWERS; ++i)
2491 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2492 packet.PowerDelta[1] = 0;
2493 packet.PowerDelta[2] = 0;
2494 packet.PowerDelta[3] = 0;
2495 packet.PowerDelta[4] = 0;
2496 packet.PowerDelta[5] = 0;
2497
2498 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2499 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2500
2501 SendDirectMessage(packet.Write());
2502
2503 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2504
2505 //update level, max level of skills
2506 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2507
2509
2510 SetLevel(level);
2511
2513
2514 // save base values (bonuses already included in stored stats
2515 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2516 SetCreateStat(Stats(i), info.stats[i]);
2517
2518 SetCreateHealth(classInfo.basehealth);
2519 SetCreateMana(classInfo.basemana);
2520
2524
2526
2527 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2529
2531
2532 if (!isDead())
2533 {
2534 // set current level health and mana/energy to maximum after applying all mods.
2535 SetFullHealth();
2542 }
2543
2544 // update level to hunter/summon pet
2545 if (Pet* pet = GetPet())
2546 pet->SynchronizeLevelWithOwner();
2547
2548 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2549 if (mailReward && sScriptMgr->CanGiveMailRewardAtGiveLevel(this, level))
2550 {
2551 //- TODO: Poor design of mail system
2552 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2553 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2554 CharacterDatabase.CommitTransaction(trans);
2555 }
2556
2558
2559 // Refer-A-Friend
2560 if (GetSession()->GetRecruiterId())
2561 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2562 if (level % 2 == 0)
2563 {
2565
2566 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2568 }
2569
2571
2572 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2573}
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition DBCEnums.h:124
@ GUILD_MEMBER_DATA_LEVEL
Definition Guild.h:59
@ CONFIG_ALWAYS_MAXSKILL
Definition IWorld.h:128
@ POWER_RAGE
Definition SharedDefines.h:270
@ POWER_HAPPINESS
Definition SharedDefines.h:273
@ POWER_ENERGY
Definition SharedDefines.h:272
@ POWER_FOCUS
Definition SharedDefines.h:271
@ PLAYER_NEXT_LEVEL_XP
Definition UpdateFields.h:340
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:949
void _ApplyAllLevelScaleItemMods(bool apply)
Definition Player.cpp:7647
void UpdateSkillsToMaxSkillsForLevel()
Definition PlayerUpdates.cpp:1125
Guild * GetGuild() const
Definition Player.cpp:16041
void UpdateSkillsForLevel()
Definition PlayerUpdates.cpp:1074
void SendQuestGiverStatusMultiple()
Definition Player.cpp:7724
void SetCreateStat(Stats stat, float val)
Definition Unit.h:1010
void SetCreateHealth(uint32 val)
Definition Unit.h:1058
void SetCreateMana(uint32 val)
Definition Unit.h:1080
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition Unit.cpp:15526
uint32 GetCreateHealth() const
Definition Unit.h:1042
uint32 GetCreateMana() const
Definition Unit.h:1079
bool isDead() const
Definition Unit.h:1709
Definition MiscPackets.h:45
uint32 Level
Definition MiscPackets.h:51
std::array< uint32, MAX_STATS > StatDelta
Definition MiscPackets.h:54
std::array< uint32, MAX_POWERS > PowerDelta
Definition MiscPackets.h:53
uint32 HealthDelta
Definition MiscPackets.h:52
WorldPacket const * Write() override
Definition MiscPackets.cpp:34
Definition ObjectMgr.h:543
uint32 senderEntry
Definition ObjectMgr.h:549
uint32 mailTemplateId
Definition ObjectMgr.h:548
Definition Player.h:294
uint32 basehealth
Definition Player.h:296
uint32 basemana
Definition Player.h:297
Definition Player.h:308
std::array< uint32, MAX_STATS > stats
Definition Player.h:314

References _ApplyAllLevelScaleItemMods(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CharacterDatabase, CONFIG_ALWAYS_MAXSKILL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreateHealth(), Unit::GetCreateMana(), Unit::GetCreateStat(), GetGuild(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Unit::getRaceMask(), GetSession(), GUILD_MEMBER_DATA_LEVEL, Object::HasByteFlag(), WorldPackets::Misc::LevelUpInfo::HealthDelta, InitGlyphsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), Unit::isDead(), WorldPackets::Misc::LevelUpInfo::Level, m_grantableLevels, m_Played_time, MAIL_CREATURE, MailLevelReward::mailTemplateId, MAX_STATS, PLAYED_TIME_LEVEL, PLAYER_FIELD_BYTES, PLAYER_NEXT_LEVEL_XP, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, WorldPackets::Misc::LevelUpInfo::PowerDelta, SendDirectMessage(), MailLevelReward::senderEntry, MailDraft::SendMailTo(), SendQuestGiverStatusMultiple(), Object::SetByteFlag(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Unit::SetFullHealth(), Unit::SetLevel(), Unit::SetPower(), Unit::SetUInt32Value(), sObjectMgr, sScriptMgr, STAT_STRENGTH, WorldPackets::Misc::LevelUpInfo::StatDelta, PlayerLevelInfo::stats, sWorld, UpdateAchievementCriteria(), UpdateAllStats(), UpdateSkillsForLevel(), UpdateSkillsToMaxSkillsForLevel(), and WorldPackets::Misc::LevelUpInfo::Write().

Referenced by GiveXP(), WorldSession::HandleAcceptGrantLevel(), and character_commandscript::HandleCharacterLevel().

◆ GiveQuestSourceItem()

bool Player::GiveQuestSourceItem ( Quest const *  quest)
1336{
1337 uint32 srcitem = quest->GetSrcItemId();
1338 if (srcitem > 0)
1339 {
1340 uint32 count = quest->GetSrcItemCount();
1341 if (count <= 0)
1342 count = 1;
1343
1344 ItemPosCountVec dest;
1345 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1346 if (msg == EQUIP_ERR_OK)
1347 {
1348 Item* item = StoreNewItem(dest, srcitem, true);
1349 SendNewItem(item, count, true, false);
1350 return true;
1351 }
1352 // player already have max amount required item, just report success
1353 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1354 return true;
1355 else
1356 SendEquipError(msg, nullptr, nullptr, srcitem);
1357 return false;
1358 }
1359
1360 return true;
1361}

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by AddQuest().

◆ GiveXP()

void Player::GiveXP ( uint32  xp,
Unit victim,
float  group_rate = 1.0f,
bool  isLFGReward = false 
)
2396{
2397 if (xp < 1)
2398 {
2399 return;
2400 }
2401
2402 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2403 {
2404 return;
2405 }
2406
2408 {
2409 return;
2410 }
2411
2412 if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient())
2413 {
2414 return;
2415 }
2416
2417 uint8 level = GetLevel();
2418
2419 // Favored experience increase START
2420 uint32 zone = GetZoneId();
2421 float favored_exp_mult = 0;
2422 if ((zone == 3483 || zone == 3562 || zone == 3836 || zone == 3713 || zone == 3714) && HasAnyAuras(32096 /*Thrallmar's Favor*/, 32098 /*Honor Hold's Favor*/))
2423 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2424
2425 xp = uint32(xp * (1 + favored_exp_mult));
2426 // Favored experience increase END
2427
2428 // XP to money conversion processed in Player::RewardQuest
2429 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2430 return;
2431
2432 uint32 bonus_xp = 0;
2433 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2434
2435 // RaF does NOT stack with rested experience
2436 if (recruitAFriend)
2437 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2438 else
2439 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2440
2441 // hooks and multipliers can modify the xp with a zero or negative value
2442 // check again before sending invalid xp to the client
2443 if (xp < 1)
2444 {
2445 return;
2446 }
2447
2448 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2449
2452 uint32 newXP = curXP + xp + bonus_xp;
2453
2454 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2455 {
2456 newXP -= nextLvlXP;
2457
2458 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2459 GiveLevel(level + 1);
2460
2461 level = GetLevel();
2463 }
2464
2465 SetUInt32Value(PLAYER_XP, newXP);
2466}
@ PLAYER_FLAGS_NO_XP_GAIN
Definition Player.h:504
bool hasLootRecipient() const
Definition Creature.h:234
bool IsCreature() const
Definition Object.h:204
void GiveLevel(uint8 level)
Definition Player.cpp:2470
uint32 GetXPRestBonus(uint32 xp)
Definition Player.cpp:8896
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition Player.cpp:2376
bool HasAnyAuras(Auras... spellIds) const
Checks if the unit has ANY specified auras.
Definition Unit.h:1402

References CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAnyAuras(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), Object::IsCreature(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Unit::SetUInt32Value(), sWorld, and Object::ToCreature().

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1819{
1820 if (Group* group = GetGroup())
1821 {
1822 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1823 {
1824 Player* player = itr->GetSource();
1825
1826 // for any leave or dead (with not released body) group member at appropriate distance
1827 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1828 player->AreaExploredOrEventHappens(questId);
1829 }
1830 }
1831 else
1833}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12802
void AreaExploredOrEventHappens(uint32 questId)
Definition PlayerQuest.cpp:1791

References AreaExploredOrEventHappens(), GetCorpse(), GetGroup(), and IsAtGroupRewardDistance().

Referenced by SmartAI::EndPath(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), Map::ScriptsProcess(), SmartAI::StopFollow(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_rinji::npc_rinjiAI::WaypointReached(), npc_corporal_keeshan::npc_corporal_keeshanAI::WaypointReached(), npc_deathstalker_erland::npc_deathstalker_erlandAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached(), npc_gilthares::npc_giltharesAI::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_bonker_togglevolt::npc_bonker_togglevoltAI::WaypointReached(), npc_emily::npc_emilyAI::WaypointReached(), npc_apothecary_hanes::npc_Apothecary_HanesAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::WaypointReached(), npc_bessy::npc_bessyAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), npc_kservant::npc_kservantAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
5040{
5041 if (modGroup >= BASEMOD_END)
5042 {
5043 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
5044 return;
5045 }
5046
5047 switch (modType)
5048 {
5049 case FLAT_MOD:
5050 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
5051 break;
5052 case PCT_MOD:
5053 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
5054 break;
5055 }
5056
5057 if (!CanModifyStats())
5058 return;
5059
5060 switch (modGroup)
5061 {
5062 case CRIT_PERCENTAGE:
5064 break;
5067 break;
5070 break;
5071 case SHIELD_BLOCK_VALUE:
5073 break;
5074 default:
5075 break;
5076 }
5077}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void UpdateShieldBlockValue()
Definition StatSystem.cpp:522
void UpdateCritPercentage(WeaponAttackType attType)
Definition StatSystem.cpp:641

References ApplyPercentModFloatVar(), BASE_ATTACK, BASEMOD_END, Unit::CanModifyStats(), CRIT_PERCENTAGE, FLAT_MOD, LOG_ERROR, m_auraBaseMod, OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PCT_MOD, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, SHIELD_BLOCK_VALUE, UpdateCritPercentage(), and UpdateShieldBlockValue().

Referenced by _ApplyItemBonuses(), _ApplyWeaponDependentAuraCritMod(), ApplyEnchantment(), AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleAuraModWeaponCritPercent(), and AuraEffect::HandleShieldBlockValue().

◆ HandleDrowning()

void Player::HandleDrowning ( uint32  time_diff)
protected
Todo:
: Check this formula
Todo:
: Check this formula
836{
838 return;
839
840 // In water
842 {
843 // Breath timer not activated - activate it
845 {
848 }
849 else // If activated - do tick
850 {
851 m_MirrorTimer[BREATH_TIMER] -= time_diff;
852 // Timer limit - need deal damage
854 {
856 // Calculate and deal damage
858 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
860 }
861 else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need
863 }
864 }
865 else if (m_MirrorTimer[BREATH_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
866 {
867 int32 UnderWaterTime = getMaxTimer(BREATH_TIMER);
868 // Need breath regen
869 m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
870 if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
874 }
875
876 // In dark water
878 {
879 // Fatigue timer not activated - activate it
881 {
884 }
885 else
886 {
887 m_MirrorTimer[FATIGUE_TIMER] -= time_diff;
888 // Timer limit - need deal damage or teleport ghost to graveyard
890 {
892 if (IsAlive()) // Calculate and deal damage
893 {
894 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
896 }
897 else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard
899 }
902 }
903 }
904 else if (m_MirrorTimer[FATIGUE_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
905 {
906 int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
907 m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
908 if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
912 }
913
914 if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId))
915 {
916 // Breath timer not activated - activate it
919 else
920 {
921 m_MirrorTimer[FIRE_TIMER] -= time_diff;
922 if (m_MirrorTimer[FIRE_TIMER] < 0)
923 {
924 m_MirrorTimer[FIRE_TIMER] += 2020;
925 // Calculate and deal damage
927 uint32 damage = urand(600, 700);
930 // need to skip Slime damage in Undercity,
931 // maybe someone can find better way to handle environmental damage
932 //else if (m_zoneUpdateId != 1497)
933 // EnvironmentalDamage(DAMAGE_SLIME, damage);
934 }
935 }
936 }
937 else
939
940 // Recheck timers flag
941 m_MirrorTimerFlags &= ~UNDERWATER_EXIST_TIMERS;
942 for (uint8 i = 0; i < MAX_TIMERS; ++i)
944 {
946 break;
947 }
949}
@ DAMAGE_DROWNING
Definition Player.h:840
@ DAMAGE_EXHAUSTED
Definition Player.h:839
@ UNDERWATER_INDARKWATER
Definition Player.h:104
@ UNDERWATER_EXIST_TIMERS
Definition Player.h:106
@ UNDERWATER_INWATER
Definition Player.h:101
@ UNDERWATER_INLAVA
Definition Player.h:102
void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
Definition Player.cpp:732
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
Definition Player.cpp:755
void RepopAtGraveyard()
Definition Player.cpp:4940
int32 getMaxTimer(MirrorTimerType timer)
Definition Player.cpp:808
void StopMirrorTimer(MirrorTimerType Type)
Definition Player.cpp:743
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2115
uint32 SpellId
Definition DBCStructure.h:1288

References Unit::_lastLiquid, BREATH_TIMER, DAMAGE_DROWNING, DAMAGE_EXHAUSTED, DAMAGE_LAVA, DISABLED_MIRROR_TIMER, EnvironmentalDamage(), FATIGUE_TIMER, FIRE_TIMER, Unit::GetLevel(), Unit::GetMaxHealth(), getMaxTimer(), HasPlayerFlag(), IN_MILLISECONDS, Unit::IsAlive(), m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, MAX_TIMERS, PLAYER_FLAGS_GHOST, RepopAtGraveyard(), SendMirrorTimer(), LiquidTypeEntry::SpellId, StopMirrorTimer(), UNDERWATER_EXIST_TIMERS, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INWATER, and urand().

Referenced by Update().

◆ HandleFall()

void Player::HandleFall ( MovementInfo const &  movementInfo)
13889{
13890 // calculate total z distance of the fall
13891 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13892
13893 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13894 // 14.57 can be calculated by resolving damageperc formula below to 0
13895 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13897 !HasFlyAura())
13898 {
13899 //Safe fall, fall height reduction
13901
13902 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13903 uint32 original_health = GetHealth(), final_damage = 0;
13904
13906 {
13907 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13908
13909 //float height = movementInfo.pos.m_positionZ;
13910 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13911
13912 if (damage > 0)
13913 {
13914 //Prevent fall damage from being more than the player maximum health
13915 if (damage > GetMaxHealth())
13916 damage = GetMaxHealth();
13917
13918 // Gust of Wind
13919 if (HasAura(43621))
13920 damage = GetMaxHealth() / 2;
13921
13922 // Divine Protection
13923 if (HasAura(498))
13924 {
13925 damage /= 2;
13926 }
13927
13928 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13929 }
13930
13931 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13932 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13933 }
13934
13935 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13936 if (IsAlive() && final_damage < original_health)
13938 }
13939}
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition DBCEnums.h:139
@ RATE_DAMAGE_FALL
Definition IWorld.h:506
@ CHEAT_GOD
Definition Player.h:1004
@ SPELL_AURA_SAFE_FALL
Definition SpellAuraDefines.h:207
bool GetCommandStatus(uint32 command) const
Definition Player.h:1195
bool HasFlyAura() const
Definition Unit.h:1717
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12960

References ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, CHEAT_GOD, DAMAGE_FALL, EnvironmentalDamage(), MovementInfo::fallTime, GetCommandStatus(), Unit::GetHealth(), Unit::GetMaxHealth(), Position::GetPositionZ(), Unit::GetTotalAuraModifier(), Unit::HasAura(), Unit::HasFeatherFallAura(), Unit::HasFlyAura(), Unit::HasHoverAura(), Unit::IsAlive(), Unit::isDead(), IsGameMaster(), Unit::IsImmunedToDamageOrSchool(), LOG_DEBUG, m_lastFallZ, MovementInfo::pos, RATE_DAMAGE_FALL, SPELL_AURA_SAFE_FALL, SPELL_SCHOOL_MASK_NORMAL, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMovementOpcodes().

◆ HandleSobering()

void Player::HandleSobering ( )
protected

The player sobers by 1% every 9 seconds.

953{
954 m_drunkTimer = 0;
955
956 uint8 currentDrunkValue = GetDrunkValue();
957 uint8 drunk = currentDrunkValue ? --currentDrunkValue : 0;
958 SetDrunkValue(drunk);
959}
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition Player.cpp:972

References GetDrunkValue(), m_drunkTimer, and SetDrunkValue().

Referenced by Update().

◆ Has310Flyer()

bool Player::Has310Flyer ( bool  checkAllSpells,
uint32  excludeSpellId = 0 
)
3499{
3500 if (!checkAllSpells)
3502 else
3503 {
3504 SetHas310Flyer(false);
3505 SpellInfo const* spellInfo;
3506 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3507 {
3508 // pussywizard:
3509 if (itr->second->State == PLAYERSPELL_REMOVED)
3510 continue;
3511
3512 if (itr->first == excludeSpellId)
3513 continue;
3514
3515 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3516 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3517 {
3518 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3519 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3520
3521 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3522 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3523 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3524 spellInfo->Effects[i].CalcValue() == 310)
3525 {
3526 SetHas310Flyer(true);
3527 return true;
3528 }
3529 }
3530 }
3531 }
3532
3533 return false;
3534}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition Player.h:595

References SpellInfo::Effects, m_ExtraFlags, m_spells, MAX_SPELL_EFFECTS, PLAYER_EXTRA_HAS_310_FLYER, PLAYERSPELL_REMOVED, SetHas310Flyer(), SKILL_MOUNTS, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and sSpellMgr.

Referenced by _addSpell(), and removeSpell().

◆ HasAchieved()

bool Player::HasAchieved ( uint32  achievementId) const
13957{
13958 return m_achievementMgr->HasAchieved(achievementId);
13959}
bool HasAchieved(uint32 achievementId) const
Definition AchievementMgr.cpp:2434

References AchievementMgr::HasAchieved(), and m_achievementMgr.

Referenced by _LoadBrewOfTheMonth(), spell_gen_on_tournament_mount::GetPennatSpellId(), BattlegroundIC::HandleAreaTrigger(), lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ HasActivePowerType()

bool Player::HasActivePowerType ( Powers  power)
overridevirtual

Reimplemented from Unit.

2764{
2765 if (sScriptMgr->OnPlayerHasActivePowerType(this, power))
2766 return true;
2767 else
2768 return (getPowerType() == power);
2769}

References Unit::getPowerType(), and sScriptMgr.

Referenced by Create(), and ResetAllPowers().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3905{
3906 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3907 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3908}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by _AddSpellCooldown(), ActivateSpec(), spell_dk_dancing_rune_weapon::CheckProc(), WorldSession::HandleCastSpellOpcode(), and learnSpell().

◆ HasAtLoginFlag()

◆ HasCasterSpec()

bool Player::HasCasterSpec ( )
16146{
16147 switch (GetSpec(GetActiveSpec()))
16148 {
16161 return true;
16162 default:
16163 break;
16164 }
16165 return false;
16166}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition Player.h:153
@ TALENT_TREE_MAGE_FIRE
Definition Player.h:167
@ TALENT_TREE_PRIEST_SHADOW
Definition Player.h:159
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition Player.h:163
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition Player.h:151
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition Player.h:170
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition Player.h:171
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition Player.h:169
@ TALENT_TREE_MAGE_ARCANE
Definition Player.h:166
@ TALENT_TREE_MAGE_FROST
Definition Player.h:168
@ TALENT_TREE_DRUID_BALANCE
Definition Player.h:172
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition Player.h:152
uint32 GetSpec(int8 spec=-1)
Definition Player.cpp:16047

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_BALANCE, TALENT_TREE_HUNTER_BEAST_MASTERY, TALENT_TREE_HUNTER_MARKSMANSHIP, TALENT_TREE_HUNTER_SURVIVAL, TALENT_TREE_MAGE_ARCANE, TALENT_TREE_MAGE_FIRE, TALENT_TREE_MAGE_FROST, TALENT_TREE_PRIEST_SHADOW, TALENT_TREE_SHAMAN_ELEMENTAL, TALENT_TREE_WARLOCK_AFFLICTION, TALENT_TREE_WARLOCK_DEMONOLOGY, and TALENT_TREE_WARLOCK_DESTRUCTION.

◆ HasCorpse()

◆ HasDelayedTeleport()

bool Player::HasDelayedTeleport ( ) const
inlineprivate
2955{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1620 {
1621 if (amount > 0)
1622 return (GetMoney() >= (uint32) amount);
1623 return true;
1624 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16169{
16170 switch (GetSpec(GetActiveSpec()))
16171 {
16177 return true;
16178 default:
16179 break;
16180 }
16181 return false;
16182}
@ TALENT_TREE_DRUID_RESTORATION
Definition Player.h:174
@ TALENT_TREE_SHAMAN_RESTORATION
Definition Player.h:165
@ TALENT_TREE_PRIEST_HOLY
Definition Player.h:158
@ TALENT_TREE_PALADIN_HOLY
Definition Player.h:148
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition Player.h:157

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_RESTORATION, TALENT_TREE_PALADIN_HOLY, TALENT_TREE_PRIEST_DISCIPLINE, TALENT_TREE_PRIEST_HOLY, and TALENT_TREE_SHAMAN_RESTORATION.

◆ HasItemCount()

bool Player::HasItemCount ( uint32  item,
uint32  count = 1,
bool  inBankAlso = false 
) const
656{
657 uint32 tempcount = 0;
659 {
661 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
662 {
663 tempcount += pItem->GetCount();
664 if (tempcount >= count)
665 return true;
666 }
667 }
669 {
671 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
672 {
673 tempcount += pItem->GetCount();
674 if (tempcount >= count)
675 return true;
676 }
677 }
679 {
680 if (Bag* pBag = GetBagByPos(i))
681 {
682 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
683 {
684 Item* pItem = GetItemByPos(i, j);
685 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
686 {
687 tempcount += pItem->GetCount();
688 if (tempcount >= count)
689 return true;
690 }
691 }
692 }
693 }
694
695 if (inBankAlso)
696 {
698 {
700 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
701 {
702 tempcount += pItem->GetCount();
703 if (tempcount >= count)
704 return true;
705 }
706 }
708 {
709 if (Bag* pBag = GetBagByPos(i))
710 {
711 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
712 {
713 Item* pItem = GetItemByPos(i, j);
714 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
715 {
716 tempcount += pItem->GetCount();
717 if (tempcount >= count)
718 return true;
719 }
720 }
721 }
722 }
723 }
724
725 return false;
726}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, Item::IsInTrade(), and KEYRING_SLOT_START.

Referenced by LootItem::AllowedForPlayer(), BuyItemFromVendorSlot(), CanCompleteRepeatableQuest(), Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), Spell::EffectCreateItem2(), GetResurrectionSpellId(), go_soulwell::go_soulwellAI::GossipHello(), go_celestial_planetarium_access::go_celestial_planetarium_accessAI::GossipHello(), misc_commandscript::HandleAddItemCommand(), lfg::LFGMgr::InitializeLockedDungeons(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), AreaTrigger_at_voltarus_middle::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_twilight_grove::OnTrigger(), NPCStaveQuestAI::QuestIncomplete(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Satisfy(), npc_aquementas::npc_aquementasAI::SendItem(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and Spell::WriteCastResultInfo().

◆ HasItemFitToSpellRequirements()

bool Player::HasItemFitToSpellRequirements ( SpellInfo const *  spellInfo,
Item const *  ignoreItem = nullptr 
) const
12556{
12557 if (spellInfo->EquippedItemClass < 0)
12558 return true;
12559
12560 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12561 // for optimize check 2 used cases only
12562 switch (spellInfo->EquippedItemClass)
12563 {
12564 case ITEM_CLASS_WEAPON:
12565 {
12568 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12569 return true;
12570 break;
12571 }
12572 case ITEM_CLASS_ARMOR:
12573 {
12574 // tabard not have dependent spells
12577 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12578 return true;
12579
12580 // shields can be equipped to offhand slot
12582 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12583 return true;
12584
12585 // ranged slot can have some armor subclasses
12587 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12588 return true;
12589
12590 break;
12591 }
12592 default:
12593 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12594 break;
12595 }
12596
12597 return false;
12598}

References EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, SpellInfo::EquippedItemClass, GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsFitToSpellRequirements(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, and LOG_ERROR.

Referenced by Unit::CalcArmorReducedDamage(), Spell::CheckItems(), and RemoveItemDependentAurasAndCasts().

◆ HasItemOrGemWithIdEquipped()

bool Player::HasItemOrGemWithIdEquipped ( uint32  item,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
729{
730 uint32 tempcount = 0;
732 {
733 if (i == except_slot)
734 continue;
735
737 if (pItem && pItem->GetEntry() == item)
738 {
739 tempcount += pItem->GetCount();
740 if (tempcount >= count)
741 return true;
742 }
743 }
744
745 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
746 if (pProto && pProto->GemProperties)
747 {
749 {
750 if (i == except_slot)
751 continue;
752
754 if (pItem && pItem->GetTemplate()->Socket[0].Color)
755 {
756 tempcount += pItem->GetGemCountWithID(item);
757 if (tempcount >= count)
758 return true;
759 }
760 }
761 }
762
763 return false;
764}
uint8 GetGemCountWithID(uint32 GemID) const
Definition Item.cpp:1014

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, Item::GetCount(), Object::GetEntry(), Item::GetGemCountWithID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, sObjectMgr, and ItemTemplate::Socket.

Referenced by npc_eris_hevenfire::npc_eris_hevenfireAI::CanBeSeen(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::CanBeSeen(), CanEquipUniqueItem(), achievement_pb_pilgrims_peril::OnCheck(), and achievement_pb_terokkar_turkey_time::OnCheck().

◆ HasItemOrGemWithLimitCategoryEquipped()

bool Player::HasItemOrGemWithLimitCategoryEquipped ( uint32  limitCategory,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
767{
768 uint32 tempcount = 0;
770 {
771 if (i == except_slot)
772 continue;
773
775 if (!pItem)
776 continue;
777
778 ItemTemplate const* pProto = pItem->GetTemplate();
779 if (!pProto)
780 continue;
781
782 if (pProto->ItemLimitCategory == limitCategory)
783 {
784 tempcount += pItem->GetCount();
785 if (tempcount >= count)
786 return true;
787 }
788
790 {
791 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
792 if (tempcount >= count)
793 return true;
794 }
795 }
796
797 return false;
798}

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetCount(), Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::ItemLimitCategory, PRISMATIC_ENCHANTMENT_SLOT, and ItemTemplate::Socket.

Referenced by CanEquipUniqueItem().

◆ HasItemTotemCategory()

bool Player::HasItemTotemCategory ( uint32  TotemCategory) const
852{
853 Item* pItem;
855 {
858 return true;
859 }
861 {
864 return true;
865 }
867 {
868 if (Bag* pBag = GetBagByPos(i))
869 {
870 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
871 {
872 pItem = GetItemByPos(i, j);
874 return true;
875 }
876 }
877 }
878 return false;
879}
TotemCategory
Definition SharedDefines.h:3083
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition PlayerStorage.cpp:881

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, IsTotemCategoryCompatiableWith(), and KEYRING_SLOT_START.

Referenced by Spell::CheckItems().

◆ HasMeleeSpec()

bool Player::HasMeleeSpec ( )
16123{
16124 switch (GetSpec(GetActiveSpec()))
16125 {
16135 return true;
16137 if (GetShapeshiftForm() == FORM_CAT)
16138 return true;
16139 default:
16140 break;
16141 }
16142 return false;
16143}
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition Player.h:161
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition Player.h:173
@ TALENT_TREE_WARRIOR_FURY
Definition Player.h:146
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition Player.h:154
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition Player.h:162
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition Player.h:164
@ TALENT_TREE_WARRIOR_ARMS
Definition Player.h:145
@ TALENT_TREE_ROGUE_COMBAT
Definition Player.h:155
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition Player.h:150
@ TALENT_TREE_ROGUE_SUBTLETY
Definition Player.h:156
@ FORM_CAT
Definition UnitDefines.h:70

References FORM_CAT, GetActiveSpec(), Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_FROST, TALENT_TREE_DEATH_KNIGHT_UNHOLY, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_RETRIBUTION, TALENT_TREE_ROGUE_ASSASSINATION, TALENT_TREE_ROGUE_COMBAT, TALENT_TREE_ROGUE_SUBTLETY, TALENT_TREE_SHAMAN_ENHANCEMENT, TALENT_TREE_WARRIOR_ARMS, and TALENT_TREE_WARRIOR_FURY.

◆ HasPendingBind()

◆ HasPendingSpectatorForBG()

bool Player::HasPendingSpectatorForBG ( uint32  bgInstanceId) const
inline
2588{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck(), and TeleportTo().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2496{
2497 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2498 {
2499 uint32 questId = GetQuestSlotQuestId(i);
2500 if (questId == 0)
2501 continue;
2502
2503 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2504 if (!quest)
2505 continue;
2506
2507 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2508 return true;
2509 }
2510
2511 return false;
2512}

References GetQuestSlotQuestId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_FLAGS_PVP, and sObjectMgr.

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), and UpdateZone().

◆ HasQuest()

bool Player::HasQuest ( uint32  questId) const
102{
103 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
104 {
105 uint32 questid = GetQuestSlotQuestId(i);
106 if (questid == questId)
107 {
108 return true;
109 }
110 }
111
112 return false;
113}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12420{
12421 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12422 {
12423 uint32 questid = GetQuestSlotQuestId(i);
12424 if (questid == 0)
12425 continue;
12426
12427 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12428 if (qs_itr == m_QuestStatus.end())
12429 continue;
12430
12431 QuestStatusData const& qs = qs_itr->second;
12432
12434 {
12435 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12436 if (!qinfo)
12437 continue;
12438
12439 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12440 continue;
12441
12442 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12443 {
12444 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12445 continue;
12446
12447 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12448 return true;
12449 }
12450 }
12451 }
12452 return false;
12453}
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1927
bool IsAllowedInRaid(Difficulty difficulty) const
Definition QuestDef.cpp:296

References QuestStatusData::CreatureOrGOCount, GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::IsAllowedInRaid(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::ActivateToQuest().

◆ HasQuestForItem()

bool Player::HasQuestForItem ( uint32  itemId,
uint32  excludeQuestId = 0,
bool  turnIn = false,
bool *  showInLoot = nullptr 
) const
2265{
2266 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2267 {
2268 uint32 questid = GetQuestSlotQuestId(i);
2269 if (questid == 0 || questid == excludeQuestId)
2270 continue;
2271
2272 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2273 if (qs_itr == m_QuestStatus.end())
2274 continue;
2275
2276 QuestStatusData const& q_status = qs_itr->second;
2277
2278 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2279 {
2280 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2281 if (!qinfo)
2282 continue;
2283
2284 // hide quest if player is in raid-group and quest is no raid quest
2285 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2286 {
2287 if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
2288 {
2289 continue;
2290 }
2291 }
2292
2293 // There should be no mixed ReqItem/ReqSource drop
2294 // This part for ReqItem drop
2295 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2296 {
2297 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2298 {
2299 if (showInLoot)
2300 {
2301 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2302 {
2303 return true;
2304 }
2305
2306 *showInLoot = false;
2307 }
2308 else
2309 {
2310 return true;
2311 }
2312 }
2313
2314 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2315 {
2316 return true;
2317 }
2318 }
2319 // This part - for ReqSource
2320 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2321 {
2322 // examined item is a source item
2323 if (qinfo->ItemDrop[j] == itemid)
2324 {
2325 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2326 uint32 ownedCount = GetItemCount(itemid, true);
2327 // 'unique' item
2328 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2329 return true;
2330
2331 // allows custom amount drop when not 0
2332 if (qinfo->ItemDropQuantity[j])
2333 {
2334 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2335 return true;
2336 }
2337 else if (ownedCount < pProto->GetMaxStackSize())
2338 return true;
2339 }
2340 }
2341 }
2342 }
2343 return false;
2344}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:303
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:302
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:300

References GetDifficulty(), GetGroup(), GetItemCount(), WorldObject::GetMap(), GetQuestSlotQuestId(), InBattleground(), Quest::IsAllowedInRaid(), QuestStatusData::ItemCount, Quest::ItemDrop, Quest::ItemDropQuantity, m_QuestStatus, MAX_QUEST_LOG_SIZE, ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and QuestStatusData::Status.

Referenced by LootItem::AllowedForPlayer(), LootTemplate::HasQuestDropForPlayer(), LootTemplate::LootGroup::HasQuestDropForPlayer(), at_twilight_grove::OnTrigger(), and RewardQuest().

◆ HasReceivedSpectatorResetFor()

bool Player::HasReceivedSpectatorResetFor ( ObjectGuid  guid)
inline

◆ HasRestFlag()

bool Player::HasRestFlag ( RestFlag  restFlag) const
inline
1214{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ hasSpanishClient()

bool Player::hasSpanishClient ( )
inline
1103 {
1105 }
@ LOCALE_esES
Definition Common.h:72
@ LOCALE_esMX
Definition Common.h:73
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:512

References GetSession(), WorldSession::GetSessionDbLocaleIndex(), LOCALE_esES, and LOCALE_esMX.

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3893{
3894 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3895 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3896}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), AddSpellAndCategoryCooldowns(), LootItem::AllowedForPlayer(), canCreateExtraItems(), CanCreatePerfectItem(), canFlyInZone(), Group::CanJoinBattlegroundQueue(), npc_engineering_tele_trinket::CanLearn(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::EffectCastButtons(), GetExplicitDiscoverySpell(), GetResurrectionSpellId(), GetSkillDiscoverySpell(), GetStartPosition(), GetTrainerSpellState(), WorldSession::HandleBattlemasterJoinOpcode(), Acore::PlayerCommand::HandleLearnSpellCommand(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleTrainerBuySpellOpcode(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), npc_prof_alchemy::HasAlchemySpell(), HasDiscoveredAllSpells(), npc_prof_leather::HasLeatherSpecialty(), go_evil_book_for_dummies::HasLeatherSpecialty(), npc_prof_tailor::HasTailorSpell(), npc_prof_blacksmith::HasWeaponSub(), IsActionButtonDataValid(), Creature::IsValidTrainerForPlayer(), learnQuestRewardedSpells(), boss_gloomrel::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), ProcessCastaction(), resetTalents(), WorldSession::SendTrainerList(), and TeleportTo().

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

bool Player::HasSpellItemCooldown ( uint32  spell_id,
uint32  itemid 
) const
overridevirtual

Reimplemented from Unit.

16376{
16377 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16378 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16379}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9742{
9743 if (!mod || !spell)
9744 return false;
9745
9746 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9747}

References Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3899{
3900 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3901 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3902}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
16105{
16106 switch (GetSpec())
16107 {
16111 return true;
16114 return true;
16115 break;
16116 default:
16117 break;
16118 }
16119 return false;
16120}
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition Player.h:160
@ TALENT_TREE_PALADIN_PROTECTION
Definition Player.h:149
@ TALENT_TREE_WARRIOR_PROTECTION
Definition Player.h:147
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_BEAR
Definition UnitDefines.h:74

References FORM_BEAR, FORM_DIREBEAR, Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_BLOOD, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_PROTECTION, and TALENT_TREE_WARRIOR_PROTECTION.

◆ HasTitle() [1/2]

bool Player::HasTitle ( CharTitlesEntry const *  title) const
inline
2550{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition Player.cpp:13365

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13366{
13367 if (bitIndex > MAX_TITLE_INDEX)
13368 return false;
13369
13370 uint32 fieldIndexOffset = bitIndex / 32;
13371 uint32 flag = 1 << (bitIndex % 32);
13372 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13373}
#define MAX_TITLE_INDEX
Definition Player.h:559

References Object::HasFlag(), MAX_TITLE_INDEX, and PLAYER__FIELD_KNOWN_TITLES.

Referenced by character_commandscript::HandleCharacterTitlesCommand(), lookup_commandscript::HandleLookupTitleCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), LoadFromDB(), and AchievementCriteriaData::Meets().

◆ HasWeapon()

bool Player::HasWeapon ( WeaponAttackType  type) const
inlineoverridevirtual

Implements Unit.

1268{ return GetWeaponForAttack(type, false); }

References GetWeaponForAttack().

◆ HasWeaponForAttack()

bool Player::HasWeaponForAttack ( WeaponAttackType  type) const
inlineoverridevirtual

Reimplemented from Unit.

1269{ return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); }
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:941

References GetWeaponForAttack(), and Unit::HasWeaponForAttack().

◆ HaveAtClient() [1/2]

bool Player::HaveAtClient ( ObjectGuid  guid) const
11469{
11470 if (guid == GetGUID())
11471 {
11472 return true;
11473 }
11474
11475 return m_clientGUIDs.find(guid) != m_clientGUIDs.end();
11476}
GuidUnorderedSet m_clientGUIDs
Definition Player.h:2389

References Object::GetGUID(), and m_clientGUIDs.

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11450{
11451 if (u == this)
11452 {
11453 return true;
11454 }
11455
11456 // Motion Transports are always present in player's client
11457 if (GameObject const* gameobject = u->ToGameObject())
11458 {
11459 if (gameobject->IsMotionTransport())
11460 {
11461 return true;
11462 }
11463 }
11464
11465 return m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
11466}

References Object::GetGUID(), m_clientGUIDs, and Object::ToGameObject().

Referenced by Group::AddMember(), WorldObjectChangeAccumulator::BuildPacket(), WorldObject::DestroyForNearbyPlayers(), ArenaSpectator::HandleSpectatorWatchCommand(), Map::SendInitSelf(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SetOwnerGUID(), UpdateVisibilityOf(), and UpdateVisibilityOf().

◆ InArena()

bool Player::InArena ( ) const
12335{
12337 if (!bg || !bg->isArena())
12338 return false;
12339
12340 return true;
12341}
bool isArena() const
Definition Battleground.h:413

References GetBattleground(), and Battleground::isArena().

Referenced by CreateCorpse(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleUseItemOpcode(), achievement_arena_by_type::OnCheck(), RewardHonor(), and AuraEffect::UpdatePeriodic().

◆ InBattleground()

◆ InBattlegroundQueue()

bool Player::InBattlegroundQueue ( bool  ignoreArena = false) const

◆ InBattlegroundQueueForBattlegroundQueueType()

bool Player::InBattlegroundQueueForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12277{
12279}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12258

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by Group::CanJoinBattlegroundQueue(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10610{
10612
10613 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
10614 if (ssEntry && ssEntry->attackSpeed)
10615 {
10619 }
10620 else
10622
10623 switch (form)
10624 {
10625 case FORM_GHOUL:
10626 case FORM_CAT:
10627 {
10628 if (getPowerType() != POWER_ENERGY)
10630 break;
10631 }
10632 case FORM_BEAR:
10633 case FORM_DIREBEAR:
10634 {
10635 if (getPowerType() != POWER_RAGE)
10637 break;
10638 }
10639 default: // 0, for example
10640 {
10641 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10642 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10643 setPowerType(Powers(cEntry->powerType));
10644 break;
10645 }
10646 }
10647
10648 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10649 if (!reapplyMods)
10651
10654}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition UnitDefines.h:68
@ FORM_GHOUL
Definition UnitDefines.h:76
void SetRegularAttackTime()
Definition Player.cpp:5314
void UpdateEquipSpellsAtFormChange()
Definition PlayerUpdates.cpp:1351
void setPowerType(Powers power)
Definition Unit.cpp:10033
Definition DBCStructure.h:1816
uint32 attackSpeed
Definition DBCStructure.h:1824

References SpellShapeshiftFormEntry::attackSpeed, BASE_ATTACK, BASE_ATTACK_TIME, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_GHOUL, Unit::getClass(), Unit::getPowerType(), Unit::GetShapeshiftForm(), MAX_POWERS, OFF_ATTACK, POWER_ENERGY, POWER_RAGE, ChrClassesEntry::powerType, RANGED_ATTACK, sChrClassesStore, Unit::SetAttackTime(), Unit::setPowerType(), SetRegularAttackTime(), sSpellShapeshiftFormStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10657{
10658 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10659 if (!info)
10660 {
10661 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10662 return;
10663 }
10664
10665 uint8 gender = getGender();
10666 switch (gender)
10667 {
10668 case GENDER_FEMALE:
10671 break;
10672 case GENDER_MALE:
10675 break;
10676 default:
10677 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10678 return;
10679 }
10680}
@ GENDER_MALE
Definition SharedDefines.h:61
@ GENDER_FEMALE
Definition SharedDefines.h:62
uint8 getGender() const
Definition Unit.h:814
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16828
void SetNativeDisplayId(uint32 displayId)
Definition Unit.h:1891
uint16 displayId_m
Definition Player.h:350
uint16 displayId_f
Definition Player.h:351

References PlayerInfo::displayId_f, PlayerInfo::displayId_m, GENDER_FEMALE, GENDER_MALE, Unit::getClass(), Unit::getGender(), Object::GetGUID(), Unit::getRace(), LOG_ERROR, Unit::SetDisplayId(), Unit::SetNativeDisplayId(), sObjectMgr, and Position::ToString().

Referenced by Create(), modify_commandscript::HandleModifyGenderCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), and LoadFromDB().

◆ InitGlyphsForLevel()

void Player::InitGlyphsForLevel ( )
13327{
13328 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13329 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13330 if (gs->Order)
13331 SetGlyphSlot(gs->Order - 1, gs->Id);
13332
13333 uint8 level = GetLevel();
13334 uint32 value = 0;
13335
13336 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13337 if (level >= 15)
13338 value |= (0x01 | 0x02);
13339 if (level >= 30)
13340 value |= 0x08;
13341 if (level >= 50)
13342 value |= 0x04;
13343 if (level >= 70)
13344 value |= 0x10;
13345 if (level >= 80)
13346 value |= 0x20;
13347
13349}
@ PLAYER_GLYPHS_ENABLED
Definition UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition Player.h:1764

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Unit::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4781{
4783}

References Object::_Create(), and Player.

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11548{
11550}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition IWorld.h:252

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13497{
13499 return;
13500
13501 m_runes = new Runes;
13502
13503 m_runes->runeState = 0;
13505
13506 for (uint8 i = 0; i < MAX_RUNES; ++i)
13507 {
13508 SetBaseRune(i, runeSlotTypes[i]); // init base types
13509 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13510 SetRuneCooldown(i, 0); // reset cooldowns
13511 SetGracePeriod(i, 0); // xinef: reset grace period
13512 SetRuneConvertAura(i, nullptr);
13514 }
13515
13516 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13518}
static RuneType runeSlotTypes[MAX_RUNES]
Definition Player.cpp:13486
@ NUM_RUNE_TYPES
Definition Player.h:418
@ RUNE_BLOOD
Definition Player.h:414
#define MAX_RUNES
Definition Player.h:403
@ PLAYER_RUNE_REGEN_1
Definition UpdateFields.h:386
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition Player.h:2524
void SetBaseRune(uint8 index, RuneType baseRune)
Definition Player.h:2522
void SetGracePeriod(uint8 index, uint32 period)
Definition Player.h:2525
Definition Player.h:431
void SetRuneState(uint8 index, bool set=true)
Definition Player.h:436

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, IsClass(), Runes::lastUsedRune, m_runes, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, RUNE_BLOOD, runeSlotTypes, Runes::runeState, SetBaseRune(), SetCurrentRune(), Object::SetFloatValue(), SetGracePeriod(), SetRuneConvertAura(), SetRuneCooldown(), and Runes::SetRuneState().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitStatsForLevel()

void Player::InitStatsForLevel ( bool  reapplyMods = false)
2596{
2597 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2599
2600 PlayerClassLevelInfo classInfo;
2601 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2602
2603 PlayerLevelInfo info;
2604 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2605
2606 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2607 sScriptMgr->OnSetMaxLevel(this, maxPlayerLevel);
2608 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2610
2611 // reset before any aura state sources (health set/aura apply)
2613
2615
2616 // set default cast time multiplier
2618
2619 // reset size before reapply auras
2620 SetObjectScale(1.0f);
2621
2622 // save base values (bonuses already included in stored stats
2623 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2624 SetCreateStat(Stats(i), info.stats[i]);
2625
2626 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2627 SetStat(Stats(i), info.stats[i]);
2628
2629 SetCreateHealth(classInfo.basehealth);
2630
2631 //set create powers
2632 SetCreateMana(classInfo.basemana);
2633
2635
2637
2638 //reset rating fields values
2640 SetUInt32Value(index, 0);
2641
2643 for (uint8 i = 0; i < 7; ++i)
2644 {
2648 }
2649
2650 //reset attack power, damage and attack speed fields
2652 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2654
2661
2668
2669 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2673
2674 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2675 for (uint8 i = 0; i < 7; ++i)
2677
2681
2682 // Dodge percentage
2684
2685 // set armor (resistance 0) to original value (create_agility*2)
2687 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2688 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2689 // set other resistance to original value (0)
2690 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2691 {
2693 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2694 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2695 }
2696
2699 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2700 {
2703 }
2704 // Reset no reagent cost field
2705 for (uint8 i = 0; i < 3; ++i)
2707 // Init data for form but skip reapply item mods for form
2708 InitDataForForm(reapplyMods);
2709
2710 // save new stats
2711 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2713
2714 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2715
2716 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2718
2719 // cleanup unit flags (will be re-applied if need at aura load).
2727 SetImmuneToAll(false);
2729
2731
2732 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2734
2735 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2737 {
2739 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2740
2741 }
2742 // restore if need some important flags
2743 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2744
2745 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2747
2748 // set current level health and mana/energy to maximum after applying all mods.
2749 SetFullHealth();
2757
2758 // update level to hunter/summon pet
2759 if (Pet* pet = GetPet())
2760 pet->SynchronizeLevelWithOwner();
2761}
@ PLAYER_ALLOW_ONLY_ABILITY
Definition Player.h:502
@ PLAYER_FLAGS_DND
Definition Player.h:481
@ PLAYER_FLAGS_AFK
Definition Player.h:480
@ PLAYER_FLAGS_GM
Definition Player.h:482
@ UNIT_STAND_FLAGS_ALL
Definition UnitDefines.h:52
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition UnitDefines.h:138
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition UnitDefines.h:139
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:268
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:251
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:269
@ UNIT_FLAG_DISARMED
Definition UnitDefines.h:271
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:267
@ UNIT_FLAG_CONFUSED
Definition UnitDefines.h:272
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:273
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:275
@ UNIT_FLAG_LOOTING
Definition UnitDefines.h:260
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:257
@ UNIT_FLAG_SILENCED
Definition UnitDefines.h:263
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:277
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:261
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_POWER_COST_MODIFIER
Definition UpdateFields.h:170
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
@ PLAYER_SHIELD_BLOCK
Definition UpdateFields.h:355
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ PLAYER_FIELD_BYTES2
Definition UpdateFields.h:378
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
@ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT
Definition UpdateFields.h:362
@ UNIT_FIELD_POWER_COST_MULTIPLIER
Definition UpdateFields.h:171
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
@ PLAYER_FIELD_MAX_LEVEL
Definition UpdateFields.h:384
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
@ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Definition UpdateFields.h:367
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:930
void _ApplyAllStatBonuses()
Definition StatSystem.cpp:979
void InitDataForForm(bool reapplyMods=false)
Definition Player.cpp:10609
void _RemoveAllStatBonuses()
Definition StatSystem.cpp:991
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15726
void SetStat(Stats stat, int32 val)
Definition Unit.h:1005
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition Unit.h:1133
float m_createStats[MAX_STATS]
Definition Unit.h:2062
void SetResistance(SpellSchools school, int32 val)
Definition Unit.h:1132
void RemoveStandFlags(uint8 flags)
Definition Unit.h:1701
void SetArmor(int32 val)
Definition Unit.h:1089
void SetMaxHealth(uint32 val)
Definition Unit.cpp:15594
void InitStatBuffMods()
Definition Unit.h:1015
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition Unit.h:883

References _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CONFIG_MAX_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreatePowers(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Object::HasByteFlag(), InitDataForForm(), Unit::InitStatBuffMods(), Unit::m_createStats, MAX_COMBAT_RATING, MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_ALLOW_ONLY_ABILITY, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_BYTES2, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_FIELD_MAX_LEVEL, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE, PLAYER_FIELD_MOD_TARGET_RESISTANCE, PLAYER_FLAGS_AFK, PLAYER_FLAGS_DND, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_GM, PLAYER_NEXT_LEVEL_XP, PLAYER_NO_REAGENT_COST_1, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SHIELD_BLOCK, PLAYER_SPELL_CRIT_PERCENTAGE1, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Object::RemoveByteFlag(), Object::RemoveFlag(), RemovePlayerFlag(), Unit::RemoveStandFlags(), Unit::SetArmor(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Object::SetFloatValue(), Unit::SetFullHealth(), Unit::SetImmuneToAll(), Object::SetInt32Value(), Unit::SetMaxHealth(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetResistance(), Unit::SetResistanceBuffMods(), Unit::SetStat(), Unit::SetUInt32Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), sObjectMgr, sScriptMgr, STAT_AGILITY, STAT_STRENGTH, PlayerLevelInfo::stats, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_FLAGS, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FIELD_POWER_COST_MODIFIER, UNIT_FIELD_POWER_COST_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_DISARMED, UNIT_FLAG_FLEEING, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_LOOTING, UNIT_FLAG_MOUNT, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PACIFIED, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_SILENCED, UNIT_FLAG_SKINNABLE, UNIT_FLAG_STUNNED, UNIT_FLAG_TAXI_FLIGHT, UNIT_MOD_CAST_SPEED, UNIT_STAND_FLAGS_ALL, and UpdateSkillsForLevel().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitTalentForLevel()

void Player::InitTalentForLevel ( )
2581{
2582 uint32 talentPointsForLevel = CalculateTalentsPoints();
2583
2584 // xinef: more talent points that we have are used, reset
2585 if (m_usedTalentCount > talentPointsForLevel)
2586 resetTalents(true);
2587 // xinef: else, recalculate free talent points count
2588 else
2589 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2590
2591 if (!GetSession()->PlayerLoading())
2592 SendTalentsInfoData(false); // update at client
2593}
void SendTalentsInfoData(bool pet)
Definition Player.cpp:14459
bool resetTalents(bool noResetCost=false)
Definition Player.cpp:3717
void SetFreeTalentPoints(uint32 points)
Definition Player.cpp:3812
uint32 CalculateTalentsPoints() const
Definition Player.cpp:13659

References CalculateTalentsPoints(), GetSession(), m_usedTalentCount, resetTalents(), SendTalentsInfoData(), and SetFreeTalentPoints().

Referenced by ActivateSpec(), Create(), GiveLevel(), character_commandscript::HandleCharacterLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), LoadFromDB(), and RewardQuest().

◆ InitTaxiNodesForLevel()

void Player::InitTaxiNodesForLevel ( )
inline

◆ inRandomLfgDungeon()

bool Player::inRandomLfgDungeon ( )
13114{
13115 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
13116 {
13117 Map const* map = GetMap();
13118 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
13119 }
13120
13121 return false;
13122}

References Map::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), and sLFGMgr.

◆ isAcceptWhispers()

bool Player::isAcceptWhispers ( ) const
inline

◆ IsActionButtonDataValid()

bool Player::IsActionButtonDataValid ( uint8  button,
uint32  action,
uint8  type 
)
5601{
5602 if (button >= MAX_ACTION_BUTTONS)
5603 {
5604 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5605 return false;
5606 }
5607
5608 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5609 {
5610 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5611 return false;
5612 }
5613
5614 switch (type)
5615 {
5617 if (!sSpellMgr->GetSpellInfo(action))
5618 {
5619 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5620 return false;
5621 }
5622
5623 if (!HasSpell(action))
5624 {
5625 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5626 return false;
5627 }
5628 break;
5629 case ACTION_BUTTON_ITEM:
5630 if (!sObjectMgr->GetItemTemplate(action))
5631 {
5632 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5633 return false;
5634 }
5635 break;
5636 default:
5637 break; // other cases not checked at this moment
5638 }
5639
5640 return true;
5641}
@ ACTION_BUTTON_ITEM
Definition Player.h:234
@ ACTION_BUTTON_SPELL
Definition Player.h:229
#define MAX_ACTION_BUTTONS
Definition Player.h:279
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition Player.h:255

References ACTION_BUTTON_ITEM, ACTION_BUTTON_SPELL, WorldObject::GetName(), HasSpell(), LOG_DEBUG, LOG_ERROR, MAX_ACTION_BUTTON_ACTION_VALUE, MAX_ACTION_BUTTONS, sObjectMgr, and sSpellMgr.

Referenced by addActionButton().

◆ IsActiveQuest()

bool Player::IsActiveQuest ( uint32  quest_id) const
203{
204 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
205}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9750{
9751 if (!mod || !spellInfo)
9752 return false;
9753
9754 // Mod out of charges
9755 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9756 return false;
9757
9758 // +duration to infinite duration spells making them limited
9759 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9760 return false;
9761
9762 return spellInfo->IsAffectedBySpellMod(mod);
9763}

References SpellModifier::charges, SpellInfo::GetDuration(), SpellInfo::IsAffectedBySpellMod(), Spell::m_appliedMods, SpellModifier::op, SpellModifier::ownerAura, and SPELLMOD_DURATION.

Referenced by ApplySpellMod().

◆ isAFK()

◆ isAllowedToLoot()

bool Player::isAllowedToLoot ( Creature const *  creature)
5621{
5622 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward() || creature->IsLootRewardDisabled())
5623 return false;
5624
5625 if (HasPendingBind())
5626 return false;
5627
5628 const Loot* loot = &creature->loot;
5629 if (loot->isLooted()) // nothing to loot or everything looted.
5630 return false;
5631
5632 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5633 return false;
5634
5635 if (loot->loot_type == LOOT_SKINNING)
5636 return creature->GetLootRecipientGUID() == GetGUID();
5637
5638 Group* thisGroup = GetGroup();
5639 if (!thisGroup)
5640 return this == creature->GetLootRecipient();
5641 else if (thisGroup != creature->GetLootRecipientGroup())
5642 return false;
5643
5644 switch (thisGroup->GetLootMethod())
5645 {
5646 case MASTER_LOOT:
5647 case FREE_FOR_ALL:
5648 return true;
5649 case ROUND_ROBIN:
5650 // may only loot if the player is the loot roundrobin player
5651 // or if there are free/quest/conditional item for the player
5652 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5653 return true;
5654
5655 return loot->hasItemFor(this);
5656 case GROUP_LOOT:
5657 case NEED_BEFORE_GREED:
5658 // may only loot if the player is the loot roundrobin player
5659 // or item over threshold (so roll(s) can be launched)
5660 // or if there are free/quest/conditional item for the player
5661 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5662 return true;
5663
5664 if (loot->hasOverThresholdItem())
5665 return true;
5666
5667 return loot->hasItemFor(this);
5668 }
5669
5670 return false;
5671}
@ NEED_BEFORE_GREED
Definition LootMgr.h:62
@ GROUP_LOOT
Definition LootMgr.h:61
@ MASTER_LOOT
Definition LootMgr.h:60
@ ROUND_ROBIN
Definition LootMgr.h:59
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ LOOT_SKINNING
Definition LootMgr.h:85
LootMethod GetLootMethod() const
Definition Group.cpp:2312
bool HasPendingBind() const
Definition Player.h:2447
bool hasItemFor(Player *player) const
Definition LootMgr.cpp:936
bool isLooted() const
Definition LootMgr.h:368
bool hasOverThresholdItem() const
Definition LootMgr.cpp:981
ObjectGuid roundRobinPlayer
Definition LootMgr.h:324
bool hasItemForAll() const
Definition LootMgr.cpp:921
LootType loot_type
Definition LootMgr.h:326

References FREE_FOR_ALL, GetGroup(), Object::GetGUID(), Group::GetLootMethod(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GROUP_LOOT, Loot::hasItemFor(), Loot::hasItemForAll(), Loot::hasOverThresholdItem(), HasPendingBind(), Creature::IsDamageEnoughForLootingAndReward(), Unit::isDead(), Loot::isLooted(), Creature::IsLootRewardDisabled(), Creature::loot, LOOT_SKINNING, Loot::loot_type, MASTER_LOOT, NEED_BEFORE_GREED, ROUND_ROBIN, and Loot::roundRobinPlayer.

Referenced by Unit::PatchValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11503{
11505 return true;
11506
11507 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11508 {
11509 return false;
11510 }
11511
11512 if (Player const* seerPlayer = seer->ToPlayer())
11513 {
11514 if (IsGroupVisibleFor(seerPlayer))
11515 {
11516 return true;
11517 }
11518 }
11519
11520 return false;
11521}
@ DUEL_STATE_CHALLENGED
Definition Player.h:375
bool IsGroupVisibleFor(Player const *p) const
Definition Player.cpp:2319
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition Unit.cpp:14280

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12803{
12804 WorldObject const* player = GetCorpse();
12805 if (!player || IsAlive())
12806 {
12807 player = this;
12808 }
12809
12810 if (!pRewardSource || !player->IsInMap(pRewardSource))
12811 {
12812 return false;
12813 }
12814
12815 if (pRewardSource->GetMap()->IsDungeon())
12816 {
12817 return true;
12818 }
12819
12820 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12821}
@ CONFIG_GROUP_XP_DISTANCE
Definition IWorld.h:192
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1256

References CONFIG_GROUP_XP_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetMap(), Unit::IsAlive(), Map::IsDungeon(), WorldObject::IsInMap(), and sWorld.

Referenced by KillRewarder::_InitGroupData(), KillRewarder::_RewardGroup(), SmartAI::EndPath(), GroupEventHappens(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), IsAtLootRewardDistance(), Group::NeedBeforeGreed(), RewardPlayerAndGroupAtEvent(), and npc_custodian_of_time::npc_custodian_of_timeAI::WaypointReached().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12824{
12825 if (!IsAtGroupRewardDistance(pRewardSource))
12826 {
12827 return false;
12828 }
12829
12830 if (HasPendingBind())
12831 {
12832 return false;
12833 }
12834
12835 return pRewardSource->HasAllowedLooter(GetGUID());
12836}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12839{
12840 if (!pOther)
12841 return false;
12842 WorldObject const* player = GetCorpse();
12843 if (!player || IsAlive())
12844 player = this;
12845
12846 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12847 return false;
12848
12849 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12850}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition IWorld.h:193

References CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::IsAlive(), and sWorld.

Referenced by GetsRecruitAFriendBonus().

◆ IsBagPos()

bool Player::IsBagPos ( uint16  pos)
static

◆ IsBankPos() [1/2]

◆ IsBankPos() [2/2]

bool Player::IsBankPos ( uint8  bag,
uint8  slot 
)
static
580{
581 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
582 return true;
583 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
584 return true;
585 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
586 return true;
587 return false;
588}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, and INVENTORY_SLOT_BAG_0.

◆ IsBaseRuneSlotsOnCooldown()

bool Player::IsBaseRuneSlotsOnCooldown ( RuneType  runeType) const
13521{
13522 for (uint8 i = 0; i < MAX_RUNES; ++i)
13523 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13524 return false;
13525
13526 return true;
13527}
uint32 GetRuneCooldown(uint8 index) const
Definition Player.h:2516

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

Reimplemented from Unit.

4914{
4915 return GetSession()->PlayerLoading();
4916}
bool PlayerLoading() const
Definition WorldSession.h:337

References GetSession(), and WorldSession::PlayerLoading().

Referenced by _addSpell(), addTalent(), MapInstanced::CreateInstanceForPlayer(), SendInitialPacketsAfterAddToMap(), SetHonorPoints(), SetMover(), and UpdateObjectVisibility().

◆ IsBeingTeleported()

◆ IsBeingTeleportedFar()

bool Player::IsBeingTeleportedFar ( ) const
inline

◆ IsBeingTeleportedNear()

bool Player::IsBeingTeleportedNear ( ) const
inline

◆ IsClass()

bool Player::IsClass ( Classes  playerClass,
ClassContext  context = CLASS_CONTEXT_NONE 
) const
overridevirtual

Reimplemented from Unit.

1285{
1286 Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
1287 if (scriptResult != std::nullopt)
1288 return *scriptResult;
1289 else
1290 return (getClass() == unitClass);
1291}

References Unit::getClass(), and sScriptMgr.

Referenced by _ApplyItemBonuses(), ActivateSpec(), ActivateTaxiPathTo(), AddSpellMod(), ApplyEnchantment(), CalculateTalentsPoints(), Group::CanJoinBattlegroundQueue(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::CheckRuneCost(), Create(), WorldSession::DoLootRelease(), DuelComplete(), Spell::EffectActivateRune(), Spell::EffectSummonPet(), EquipItem(), spell_class_call_handler::FilterTargets(), FindEquipSlot(), Graveyard::GetClosestGraveyard(), GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), GetStartPosition(), AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_refocus::HandleDummy(), WorldSession::HandleLootMoneyOpcode(), AuraEffect::HandlePeriodicDummyAuraTick(), Unit::HandleProcTriggerSpell(), reset_commandscript::HandleResetLevelCommand(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), InitRunes(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), LearnDefaultSkill(), Pet::LoadPetFromDB(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), PrepareGossipMenu(), RegenerateAll(), TeleportTo(), UpdateAttackPowerAndDamage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ IsCommentator()

bool Player::IsCommentator ( ) const
inline
@ PLAYER_FLAGS_COMMENTATOR2
Definition Player.h:501

References HasPlayerFlag(), and PLAYER_FLAGS_COMMENTATOR2.

Referenced by GetChatTag(), and misc_commandscript::HandleCommentatorCommand().

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2266{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition Player.h:1045

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12154{
12155 if (sObjectMgr->GetQuestTemplate(quest_id))
12156 {
12157 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12158 {
12159 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12160 {
12161 return true;
12162 }
12163 }
12164 }
12165
12166 return false;
12167}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2272{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline
@ PLAYER_FLAGS_DEVELOPER
Definition Player.h:494

References HasPlayerFlag(), and PLAYER_FLAGS_DEVELOPER.

Referenced by GetChatTag(), and misc_commandscript::HandleDevCommand().

◆ isDND()

◆ IsEquipmentPos() [1/2]

◆ IsEquipmentPos() [2/2]

bool Player::IsEquipmentPos ( uint8  bag,
uint8  slot 
)
static
571{
572 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
573 return true;
575 return true;
576 return false;
577}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )

◆ IsFalling()

bool Player::IsFalling ( ) const
2181{
2182 // Xinef: Added !IsInFlight check
2183 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2184}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16257{
16258 bool result = Unit::IsFFAPvP();
16259
16260 sScriptMgr->OnIsFFAPvP(this, result);
16261
16262 return result;
16263}
bool IsFFAPvP() const
Definition Unit.h:991

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1175{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition Player.h:590

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), InstanceMap::CannotEnter(), CanTameExoticPets(), Spell::CheckCast(), CheckInstanceLoginValid(), SpellInfo::CheckTarget(), AchievementMgr::CompletedAchievement(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), spell_class_call_polymorph::FilterTargets(), GetPhaseMaskForSpawn(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattlemasterJoinOpcode(), HandleFall(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInspectOpcode(), WorldSession::HandleMessagechatOpcode(), mmaps_commandscript::HandleMmapPathCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), tele_commandscript::HandleTeleCommand(), IsValidCombatTarget(), ThreatCalcHelper::isValidProcess(), boss_felblood_kaelthas::LapseAction(), WorldSession::LogoutPlayer(), MailSender::MailSender(), boss_nalorakk::MoveInLineOfSight(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_ouro_spawner::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_barnes::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), at_trigger_the_beast_movement::OnTrigger(), at_the_beast_room::OnTrigger(), at_ancient_leaf::OnTrigger(), at_lady_deathwhisper_entrance::OnTrigger(), at_icc_gauntlet_event::OnTrigger(), at_icc_putricide_trap::OnTrigger(), at_hor_shadow_throne::OnTrigger(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Unit::PatchValuesUpdate(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), boss_kologarn_pit_kill_bunny::Reset(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), npc_minigob_manabonk::SelectTargetInDalaran(), WorldSession::SendListInventory(), Spell::SendLoot(), SetIsSpectator(), Unit::TauntApply(), Unit::TauntFadeOut(), TeleportTo(), ToggleAFK(), AchievementMgr::UpdateAchievementCriteria(), boss_nefarian::UpdateAI(), UpdateFFAPvPState(), UpdateHomebindTime(), and Whisper().

◆ isGMChat()

bool Player::isGMChat ( ) const
inline
@ PLAYER_EXTRA_GM_CHAT
Definition Player.h:594

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition Player.h:593

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2320{
2321 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2322 {
2323 default:
2324 return IsInSameGroupWith(p);
2325 case 1:
2326 return IsInSameRaidWith(p);
2327 case 2:
2328 return GetTeamId() == p->GetTeamId();
2329 }
2330}
@ CONFIG_GROUP_VISIBILITY
Definition IWorld.h:262
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1893
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2332

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12707{
12708 uint8 v_level = victim->GetLevel();
12710
12711 // Victim level less gray level
12712 if (v_level <= k_grey)
12713 {
12714 return false;
12715 }
12716
12717 if (victim->IsCreature())
12718 {
12719 if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP))
12720 {
12721 return false;
12722 }
12723 }
12724
12725 return true;
12726}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition CreatureData.h:51
bool IsCritter() const
Definition Unit.h:799
bool IsTotem() const
Definition Unit.h:765
uint32 flags_extra
Definition CreatureData.h:246

References CREATURE_FLAG_EXTRA_NO_XP, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Object::IsCreature(), Unit::IsCritter(), Unit::IsPet(), Unit::IsTotem(), and Object::ToCreature().

Referenced by spell_warl_drain_soul::HandleTick(), Unit::IsTriggeredAtSpellProcEvent(), achievement_killed_exp_or_honor_target::OnCheck(), RaiseDeadCheck::operator()(), spell_warl_drain_soul::RemoveEffect(), and spell_warl_shadowburn::RemoveEffect().

◆ IsImmuneToEnvironmentalDamage()

bool Player::IsImmuneToEnvironmentalDamage ( )
750{
751 // check for GM and death state included in isAttackableByAOE
752 return (!isTargetableForAttack(false, nullptr)) || isTotalImmune();
753}
bool isTargetableForAttack(bool checkFakeDeath=true, Unit const *byWho=nullptr) const
Definition Unit.cpp:13920

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2208{
2209 if (!trigger || GetMapId() != trigger->map)
2210 return false;
2211
2212 if (trigger->radius > 0)
2213 {
2214 // if we have radius check it
2215 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2216 if (dist > trigger->radius + delta)
2217 return false;
2218 }
2219 else
2220 {
2221 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2222 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2223 return false;
2224 }
2225
2226 return true;
2227}
Definition Position.h:27
bool IsWithinBox(const Position &center, float xradius, float yradius, float zradius) const
Definition Position.cpp:111

References WorldObject::GetDistance(), WorldLocation::GetMapId(), AreaTrigger::height, Position::IsWithinBox(), AreaTrigger::length, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, AreaTrigger::width, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Update().

◆ IsInSameGroupWith()

bool Player::IsInSameGroupWith ( Player const *  p) const
2333{
2334 return p == this || (GetGroup() &&
2335 GetGroup() == p->GetGroup() &&
2336 GetGroup()->SameSubGroup(this, p));
2337}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition Group.cpp:2359

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
558{
559 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
560 return true;
562 return true;
564 return true;
565 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
566 return true;
567 return false;
568}

References CURRENCYTOKEN_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and NULL_SLOT.

◆ IsInvitedForBattlegroundInstance() [1/2]

bool Player::IsInvitedForBattlegroundInstance ( ) const
inline
2265{ return m_bgData.isInvited; }
bool isInvited
Definition Player.h:1044

References BGData::isInvited, and m_bgData.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::LogoutPlayer().

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12326{
12327 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12328 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12329 return true;
12330
12331 return false;
12332}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12268{
12269 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12270 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12271 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12272
12273 return false;
12274}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1136{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
15927{
15928 for (auto const& itr : WhisperList)
15929 {
15930 if (itr == guid)
15931 {
15932 return true;
15933 }
15934 }
15935
15936 return false;
15937}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMaxLevel()

bool Player::IsMaxLevel ( ) const

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2068{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3296{
3297 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3298 // talent dependent passives activated at form apply have proper stance data
3300 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3301 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3302}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition SharedDefines.h:475

References Unit::GetShapeshiftForm(), SpellInfo::HasAttribute(), SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, and SpellInfo::Stances.

Referenced by _addSpell(), and _addTalentAurasAndSpells().

◆ IsNeverVisible()

bool Player::IsNeverVisible ( ) const
overridevirtual

Reimplemented from WorldObject.

11479{
11481 return true;
11482
11483 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11484 return true;
11485
11486 return false;
11487}
virtual bool IsNeverVisible() const
Definition Object.h:662

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline
2425{ return GetSession()->PlayerLogout() || !IsInWorld() || !IsAlive() || IsMounted()/*+in flight*/ || GetVehicle() || IsBeingTeleported(); }
Vehicle * GetVehicle() const
Definition Unit.h:1839
bool PlayerLogout() const
Definition WorldSession.h:338

References GetSession(), Unit::GetVehicle(), Unit::IsAlive(), IsBeingTeleported(), Object::IsInWorld(), Unit::IsMounted(), and WorldSession::PlayerLogout().

Referenced by Pet::LoadPetFromDB(), and ResummonPetTemporaryUnSummonedIfAny().

◆ IsPvP()

bool Player::IsPvP ( )
16266{
16267 bool result = Unit::IsPvP();
16268
16269 sScriptMgr->OnIsPvP(this, result);
16270
16271 return result;
16272}
bool IsPvP() const
Definition Unit.h:990

References Unit::IsPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), DuelComplete(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleRequestPartyMemberStatsOpcode(), IsOutdoorPvPActive(), UpdatePvPFlag(), and UpdatePvPState().

◆ IsQuestRewarded()

bool Player::IsQuestRewarded ( uint32  quest_id) const
inline

◆ isResurrectRequested()

bool Player::isResurrectRequested ( ) const
inline

◆ isResurrectRequestedBy()

bool Player::isResurrectRequestedBy ( ObjectGuid  guid) const
inline
1834{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12395{
12396 uint32 racemask = getRaceMask();
12397 uint32 classmask = getClassMask();
12398
12399 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12400 if (bounds.first == bounds.second)
12401 return true;
12402
12403 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12404 {
12405 // skip wrong race skills
12406 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12407 continue;
12408
12409 // skip wrong class skills
12410 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12411 continue;
12412
12413 return true;
12414 }
12415
12416 return false;
12417}

References Unit::getClassMask(), Unit::getRaceMask(), and sSpellMgr.

Referenced by GetTrainerSpellState(), learn_commandscript::HandleLearnAllMySpellsCommand(), and WorldSession::SendTrainerList().

◆ IsSummonAsSpectator()

bool Player::IsSummonAsSpectator ( ) const

◆ isTaxiCheater()

bool Player::isTaxiCheater ( ) const
inline

◆ isTotalImmune()

bool Player::isTotalImmune ( ) const
13352{
13354
13355 uint32 immuneMask = 0;
13356 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13357 {
13358 immuneMask |= (*itr)->GetMiscValue();
13359 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13360 return true;
13361 }
13362 return false;
13363}
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:315
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition SpellAuraDefines.h:102

References Unit::GetAuraEffectsByType(), SPELL_AURA_SCHOOL_IMMUNITY, and SPELL_SCHOOL_MASK_ALL.

Referenced by CanUseBattlegroundObject(), and IsImmuneToEnvironmentalDamage().

◆ IsTotemCategoryCompatiableWith()

bool Player::IsTotemCategoryCompatiableWith ( ItemTemplate const *  pProto,
uint32  requiredTotemCategoryId 
) const
882{
883 if (requiredTotemCategoryId == 0)
884 return true;
885 if (pProto->TotemCategory == 0)
886 return false;
887
888 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
889 if (!itemEntry)
890 return false;
891 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
892 if (!reqEntry)
893 return false;
894
895 if (itemEntry->categoryType != reqEntry->categoryType)
896 return false;
897
898 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
899 return false;
900
901 // xinef: check skill requirements, needed for enchants!
902 if (pProto->RequiredSkill)
903 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
904 return false;
905
906 return true;
907}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition DBCStructure.h:1993
uint32 categoryType
Definition DBCStructure.h:1997
uint32 categoryMask
Definition DBCStructure.h:1998

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ IsUsingLfg()

bool Player::IsUsingLfg ( )

◆ IsValidGender()

static bool Player::IsValidGender ( uint8  Gender)
inlinestatic
1581{ return Gender <= GENDER_FEMALE; }
Gender
Definition SharedDefines.h:60

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1280{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition Player.h:1280

References IsValidPos().

Referenced by WorldSession::HandleAutoStoreBagItemOpcode(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), and IsValidPos().

◆ IsValidPos() [2/2]

bool Player::IsValidPos ( uint8  bag,
uint8  slot,
bool  explicit_pos 
)
602{
603 // post selected
604 if (bag == NULL_BAG && !explicit_pos)
605 return true;
606
607 if (bag == INVENTORY_SLOT_BAG_0)
608 {
609 // any post selected
610 if (slot == NULL_SLOT && !explicit_pos)
611 return true;
612
613 // equipment
614 if (slot < EQUIPMENT_SLOT_END)
615 return true;
616
617 // bag equip slots
619 return true;
620
621 // backpack slots
623 return true;
624
625 // keyring slots
626 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
627 return true;
628
629 // bank main slots
630 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
631 return true;
632
633 // bank bag slots
634 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
635 return true;
636
637 return false;
638 }
639
640 // bag content slots
641 // bank bag content slots
642 if (Bag* pBag = GetBagByPos(bag))
643 {
644 // any post selected
645 if (slot == NULL_SLOT && !explicit_pos)
646 return true;
647
648 return slot < pBag->GetBagSize();
649 }
650
651 // where this?
652 return false;
653}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, EQUIPMENT_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_END, KEYRING_SLOT_START, NULL_BAG, and NULL_SLOT.

◆ IsVisibleGloballyFor()

bool Player::IsVisibleGloballyFor ( Player const *  player) const
11524{
11525 if (!u)
11526 return false;
11527
11528 // Always can see self
11529 if (u == this)
11530 return true;
11531
11532 // Visible units, always are visible for all players
11533 if (IsVisible())
11534 return true;
11535
11536 // GMs are visible for higher gms (or players are visible for gms)
11537 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11538 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11539
11540 if (!sScriptMgr->NotVisibleGloballyFor(const_cast<Player*>(this), u))
11541 return true;
11542
11543 // non faction visibility non-breakable for non-GMs
11544 return false;
11545}
bool IsVisible() const
Definition Unit.h:1926
AccountTypes GetSecurity() const
Definition WorldSession.h:373

References WorldSession::GetSecurity(), GetSession(), AccountMgr::IsPlayerAccount(), Unit::IsVisible(), and sScriptMgr.

Referenced by SocialMgr::BroadcastToFriendListers(), SocialMgr::GetFriendInfo(), WorldSession::HandleAddFriendOpcode(), and ChatHandler::needReportToTarget().

◆ ItemAddedQuestCheck()

void Player::ItemAddedQuestCheck ( uint32  entry,
uint32  count 
)
1836{
1837 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1838 {
1839 uint32 questid = GetQuestSlotQuestId(i);
1840 if (questid == 0)
1841 continue;
1842
1843 QuestStatusData& q_status = m_QuestStatus[questid];
1844
1845 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1846 continue;
1847
1848 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1849 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1850 continue;
1851
1852 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1853 {
1854 uint32 reqitem = qInfo->RequiredItemId[j];
1855 if (reqitem == entry)
1856 {
1857 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1858 uint16 curitemcount = q_status.ItemCount[j];
1859 if (curitemcount < reqitemcount)
1860 {
1861 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1862 m_QuestStatusSave[questid] = true;
1863 }
1864 if (CanCompleteQuest(questid))
1865 CompleteQuest(questid);
1866 else
1868 }
1869 }
1870 }
1872}

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, QuestStatusData::Status, and UpdateForQuestWorldObjects().

Referenced by Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), MoveItemToInventory(), StoreNewItem(), and SwapItem().

◆ ItemRemovedQuestCheck()

void Player::ItemRemovedQuestCheck ( uint32  entry,
uint32  count 
)
1875{
1876 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1877 {
1878 uint32 questid = GetQuestSlotQuestId(i);
1879 if (!questid)
1880 continue;
1881
1882 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1883 if (!qInfo)
1884 continue;
1885
1887 continue;
1888
1889 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1890 {
1891 uint32 reqitem = qInfo->RequiredItemId[j];
1892 if (reqitem == entry)
1893 {
1894 QuestStatusData& q_status = m_QuestStatus[questid];
1895 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1896 uint16 curitemcount = q_status.ItemCount[j];
1897
1898 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1899 curitemcount = GetItemCount(entry, false);
1900
1901 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1902 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1903 if (newItemCount != q_status.ItemCount[j])
1904 {
1905 q_status.ItemCount[j] = newItemCount;
1906 m_QuestStatusSave[questid] = true;
1907 IncompleteQuest(questid);
1908 }
1909 }
1910 }
1911 }
1913}
void IncompleteQuest(uint32 quest_id)
Definition PlayerQuest.cpp:642

References GetItemCount(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), IncompleteQuest(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and UpdateForQuestWorldObjects().

Referenced by DestroyItem(), DestroyItemCount(), DestroyItemCount(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ JoinedChannel()

void Player::JoinedChannel ( Channel c)
5014{
5015 m_channels.push_back(c);
5016}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2057{
2058 uint16 addCastCount = 1;
2059 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2060 {
2061 uint32 questid = GetQuestSlotQuestId(i);
2062 if (!questid)
2063 continue;
2064
2065 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2066 if (!qInfo)
2067 continue;
2068
2069 QuestStatusData& q_status = m_QuestStatus[questid];
2070
2071 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2072 {
2073 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2074 {
2075 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2076 {
2077 uint32 reqTarget = 0;
2078
2079 // GO activate objective
2080 if (qInfo->RequiredNpcOrGo[j] < 0)
2081 // checked at quest_template loading
2082 reqTarget = - qInfo->RequiredNpcOrGo[j];
2083
2084 // other not this creature/GO related objectives
2085 if (reqTarget != entry)
2086 continue;
2087
2088 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2089 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2090 if (curCastCount < reqCastCount)
2091 {
2092 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2093
2094 m_QuestStatusSave[questid] = true;
2095
2096 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2097 }
2098
2099 if (CanCompleteQuest(questid))
2100 CompleteQuest(questid);
2101 else
2103
2104 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2105 break;
2106 }
2107 }
2108 }
2109 }
2110}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition PlayerQuest.cpp:2456

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::Use().

◆ KilledMonster()

void Player::KilledMonster ( CreatureTemplate const *  cInfo,
ObjectGuid  guid 
)
1916{
1917 ASSERT(cInfo);
1918
1919 if (cInfo->Entry)
1920 KilledMonsterCredit(cInfo->Entry, guid);
1921
1922 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1923 if (cInfo->KillCredit[i])
1924 KilledMonsterCredit(cInfo->KillCredit[i]);
1925}
#define MAX_KILL_CREDIT
Definition CreatureData.h:30
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition PlayerQuest.cpp:1927

References ASSERT, CreatureTemplate::Entry, CreatureTemplate::KillCredit, KilledMonsterCredit(), and MAX_KILL_CREDIT.

Referenced by KillRewarder::_RewardKillCredit(), and npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit().

◆ KilledMonsterCredit()

void Player::KilledMonsterCredit ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
1928{
1929 uint16 addkillcount = 1;
1930 uint32 real_entry = entry;
1931 if (guid)
1932 {
1933 Creature* killed = GetMap()->GetCreature(guid);
1934 if (killed && killed->GetEntry())
1935 real_entry = killed->GetEntry();
1936 }
1937
1938 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1939 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1940
1941 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1942 {
1943 uint32 questid = GetQuestSlotQuestId(i);
1944 if (!questid)
1945 continue;
1946
1947 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1948 if (!qInfo)
1949 continue;
1950 // just if !ingroup || !noraidgroup || raidgroup
1951 // xinef: or is pvp quest, and player in BG/BF group
1952 QuestStatusData& q_status = m_QuestStatus[questid];
1953 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1954 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1955 {
1956 if (!sScriptMgr->PassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1957 continue;
1958
1959 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1960 {
1961 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1962 {
1963 // skip GO activate objective or none
1964 if (qInfo->RequiredNpcOrGo[j] <= 0)
1965 continue;
1966
1967 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1968
1969 if (reqkill == real_entry)
1970 {
1971 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1972 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1973 if (curkillcount < reqkillcount)
1974 {
1975 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1976
1977 m_QuestStatusSave[questid] = true;
1978
1979 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1980 }
1981 if (CanCompleteQuest(questid))
1982 CompleteQuest(questid);
1983 else
1985
1986 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1987 break;
1988 }
1989 }
1990 }
1991 }
1992 }
1993}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition DBCEnums.h:114
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition DBCEnums.h:122
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:3328
bool IsPVPQuest() const
Definition QuestDef.h:295
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:210

References ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_TIMED_TYPE_CREATURE, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, Map::GetCreature(), GetDifficulty(), Object::GetEntry(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), Quest::IsPVPQuest(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_KILL, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, sScriptMgr, StartTimedAchievement(), QuestStatusData::Status, and UpdateAchievementCriteria().

Referenced by npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundAB::EventPlayerClickedOnFlag(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), spell_q10714_on_spirits_wings::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q12659_ahunaes_knife::HandleDummy(), spell_q9874_liquid_fire::HandleDummy(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), OutdoorPvPNA::HandleKillImpl(), BattlegroundAV::HandleKillUnit(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q11065_wrangle_some_aether_rays_aura::if(), spell_gen_have_item_auras::if(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), KilledMonster(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_scourge_cage::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_captain_saeed::OnGossipSelect(), RewardPlayerAndGroupAtEvent(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_hallows_end_train_fire::SpellHit(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ KilledPlayerCredit()

void Player::KilledPlayerCredit ( uint16  count = 1)
1996{
1997 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1998 {
1999 uint32 questid = GetQuestSlotQuestId(i);
2000 if (!questid)
2001 {
2002 continue;
2003 }
2004
2005 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2006 if (!qInfo)
2007 {
2008 continue;
2009 }
2010
2011 // just if !ingroup || !noraidgroup || raidgroup
2012 QuestStatusData& q_status = m_QuestStatus[questid];
2013 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
2014 {
2015 // Xinef: PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt, can be extended to conditions in cata ;s)
2016 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2017 {
2018 KilledPlayerCreditForQuest(count, qInfo);
2019 break; // there is only one quest per zone
2020 }
2021 }
2022 }
2023}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition PlayerQuest.cpp:2025
int32 GetZoneOrSort() const
Definition QuestDef.h:230

References GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), KilledPlayerCreditForQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by KillRewarder::_RewardPlayer().

◆ KilledPlayerCreditForQuest()

void Player::KilledPlayerCreditForQuest ( uint16  count,
Quest const *  quest 
)
2026{
2027 uint32 const questId = quest->GetQuestId();
2028
2029 auto it = m_QuestStatus.find(questId);
2030 if (it == m_QuestStatus.end())
2031 {
2032 return;
2033 }
2034
2035 QuestStatusData& questStatus = it->second;
2036
2037 uint16 curKill = questStatus.PlayerCount;
2038 uint32 reqKill = quest->GetPlayersSlain();
2039
2040 if (curKill < reqKill)
2041 {
2042 count = std::min<uint16>(reqKill - curKill, count);
2043 questStatus.PlayerCount = curKill + count;
2044
2045 m_QuestStatusSave[quest->GetQuestId()] = true;
2046
2047 SendQuestUpdateAddPlayer(quest, curKill, count);
2048 }
2049
2050 if (CanCompleteQuest(questId))
2051 {
2052 CompleteQuest(questId);
2053 }
2054}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition PlayerQuest.cpp:2479

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4573{
4574 if (IsFlying() && !GetTransport())
4576
4578
4579 StopMirrorTimers(); //disable timers(bars)
4580
4582 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4583
4586
4587 // 6 minutes until repop at graveyard
4589
4590 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4591
4592 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4593
4594 if (corpseReclaimDelay >= 0)
4595 SendCorpseReclaimDelay(corpseReclaimDelay);
4596
4597 sScriptMgr->OnPlayerJustDied(this);
4598 // don't create corpse at this moment, player might be falling
4599
4600 // update visibility
4601 //UpdateObjectVisibility(); // pussywizard: not needed
4602}
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition Player.h:565
@ MOVE_ROOT
Definition Player.h:461
@ UNIT_DYNFLAG_NONE
Definition SharedDefines.h:3120
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:627
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition Object.cpp:899
void UpdateCorpseReclaimDelay()
Definition PlayerUpdates.cpp:1921
void setDeathState(DeathState s, bool despawn=false) override
Definition Player.cpp:1015
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:740
MotionMaster * GetMotionMaster()
Definition Unit.h:1673
bool HasPreventResurectionAura() const
Definition Unit.h:1721
bool IsFlying() const
Definition Unit.h:1633

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), Corpse, WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetTransport(), Unit::HasPreventResurectionAura(), IN_MILLISECONDS, Unit::IsFlying(), m_deathTimer, MINUTE, MOVE_ROOT, MotionMaster::MoveFall(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, Unit::ReplaceAllDynamicFlags(), SendCorpseReclaimDelay(), setDeathState(), SetMovement(), sMapStore, sScriptMgr, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleMovementOpcodes(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11875{
11876 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11877 {
11878 return;
11879 }
11880
11881 // learn default race/class spells
11882 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11883 ASSERT(info);
11884 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11885 {
11886 uint32 tspell = *itr;
11887 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11888 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11889 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11890 {
11891 addSpell(tspell, SPEC_MASK_ALL, true);
11892 }
11893 else // but send in normal spell in game learn case
11894 {
11895 learnSpell(tspell);
11896 }
11897 }
11898}
@ CONFIG_START_CUSTOM_SPELLS
Definition IWorld.h:125
PlayerCreateInfoSpells customSpells
Definition Player.h:353

References addSpell(), ASSERT, CONFIG_START_CUSTOM_SPELLS, PlayerInfo::customSpells, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, sObjectMgr, SPEC_MASK_ALL, sWorld, and Position::ToString().

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnDefaultSkill()

void Player::LearnDefaultSkill ( uint32  skillId,
uint16  rank 
)
11915{
11916 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11917 if (!rcInfo)
11918 return;
11919
11920 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11921 switch (GetSkillRangeType(rcInfo))
11922 {
11924 SetSkill(skillId, 0, 300, 300);
11925 break;
11926 case SKILL_RANGE_LEVEL:
11927 {
11928 uint16 skillValue = 1;
11929 uint16 maxValue = GetMaxSkillValueForLevel();
11930 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11931 {
11932 skillValue = maxValue;
11933 }
11934 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11935 {
11936 skillValue = maxValue;
11937 }
11939 {
11940 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11941 }
11942 else if (skillId == SKILL_FIST_WEAPONS)
11943 {
11944 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11945 }
11946 else if (skillId == SKILL_LOCKPICKING)
11947 {
11948 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11949 }
11950
11951 SetSkill(skillId, 0, skillValue, maxValue);
11952 break;
11953 }
11954 case SKILL_RANGE_MONO:
11955 SetSkill(skillId, 0, 1, 1);
11956 break;
11957 case SKILL_RANGE_RANK:
11958 {
11959 if (!rank)
11960 {
11961 break;
11962 }
11963
11964 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11965 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11966 uint16 skillValue = 1;
11967 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11968 {
11969 skillValue = maxValue;
11970 }
11972 {
11973 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11974 }
11975
11976 SetSkill(skillId, rank, skillValue, maxValue);
11977 break;
11978 }
11979 default:
11980 break;
11981 }
11982}
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition DBCEnums.h:386
@ SKILL_RANGE_RANK
Definition ObjectMgr.h:677
bool IsProfessionOrRidingSkill(uint32 skill)
Definition SpellMgr.h:623
@ CLASS_CONTEXT_SKILL
Definition UnitDefines.h:232
uint32 SkillTierID
Definition DBCStructure.h:1575
uint32 Flags
Definition DBCStructure.h:1573
uint32 Value[MAX_SKILL_STEP]
Definition DBCStructure.h:1617

References CLASS_CONTEXT_SKILL, CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), IsClass(), IsProfessionOrRidingSkill(), LOG_DEBUG, SetSkill(), SKILL_FIST_WEAPONS, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_LOCKPICKING, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_RANGE_RANK, SKILL_UNARMED, SkillRaceClassInfoEntry::SkillTierID, sSkillTiersStore, sWorld, and SkillTiersEntry::Value.

Referenced by _addSpell(), and LearnDefaultSkills().

◆ LearnDefaultSkills()

void Player::LearnDefaultSkills ( )
11901{
11902 // learn default race/class skills
11903 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11904 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11905 {
11906 uint32 skillId = itr->SkillId;
11907 if (HasSkill(skillId))
11908 continue;
11909
11910 LearnDefaultSkill(skillId, itr->Rank);
11911 }
11912}
PlayerCreateInfoSkills skills
Definition Player.h:356

References Unit::getClass(), Unit::getRace(), HasSkill(), LearnDefaultSkill(), PlayerInfo::skills, and sObjectMgr.

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnPetTalent()

void Player::LearnPetTalent ( ObjectGuid  petGuid,
uint32  talentId,
uint32  talentRank 
)
14115{
14116 Pet* pet = GetPet();
14117
14118 if (!pet)
14119 return;
14120
14121 if (petGuid != pet->GetGUID())
14122 return;
14123
14124 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
14125
14126 if (CurTalentPoints == 0)
14127 return;
14128
14129 if (talentRank >= MAX_PET_TALENT_RANK)
14130 return;
14131
14132 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14133
14134 if (!talentInfo)
14135 return;
14136
14137 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14138
14139 if (!talentTabInfo)
14140 return;
14141
14142 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14143
14144 if (!ci)
14145 return;
14146
14147 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14148
14149 if (!pet_family)
14150 return;
14151
14152 if (pet_family->petTalentType < 0) // not hunter pet
14153 return;
14154
14155 // prevent learn talent for different family (cheating)
14156 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14157 return;
14158
14159 // find current max talent rank (0~5)
14160 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14161 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14162 {
14163 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14164 {
14165 curtalent_maxrank = (rank + 1);
14166 break;
14167 }
14168 }
14169
14170 // we already have same or higher talent rank learned
14171 if (curtalent_maxrank >= (talentRank + 1))
14172 return;
14173
14174 // check if we have enough talent points
14175 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14176 return;
14177
14178 // Check if it requires another talent
14179 if (talentInfo->DependsOn > 0)
14180 {
14181 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14182 {
14183 bool hasEnoughRank = false;
14184 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14185 {
14186 if (depTalentInfo->RankID[rank] != 0)
14187 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14188 hasEnoughRank = true;
14189 }
14190 if (!hasEnoughRank)
14191 return;
14192 }
14193 }
14194
14195 // Find out how many points we have in this field
14196 uint32 spentPoints = 0;
14197
14198 uint32 tTab = talentInfo->TalentTab;
14199 if (talentInfo->Row > 0)
14200 {
14201 uint32 numRows = sTalentStore.GetNumRows();
14202 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14203 {
14204 // Someday, someone needs to revamp
14205 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14206 if (tmpTalent) // the way talents are tracked
14207 {
14208 if (tmpTalent->TalentTab == tTab)
14209 {
14210 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14211 {
14212 if (tmpTalent->RankID[rank] != 0)
14213 {
14214 if (pet->HasSpell(tmpTalent->RankID[rank]))
14215 {
14216 spentPoints += (rank + 1);
14217 }
14218 }
14219 }
14220 }
14221 }
14222 }
14223 }
14224
14225 // not have required min points spent in talent tree
14226 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14227 return;
14228
14229 // spell not set in talent.dbc
14230 uint32 spellid = talentInfo->RankID[talentRank];
14231 if (spellid == 0)
14232 {
14233 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14234 return;
14235 }
14236
14237 // already known
14238 if (pet->HasSpell(spellid))
14239 return;
14240
14241 // learn! (other talent ranks will unlearned at learning)
14242 pet->learnSpell(spellid);
14243 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14244
14245 // update free talent points
14246 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14247}
#define MAX_PET_TALENT_RANK
Definition DBCStructure.h:1918
void SetFreeTalentPoints(uint8 points)
Definition Pet.h:132
bool learnSpell(uint32 spell_id)
Definition Pet.cpp:1906
uint32 Row
Definition DBCStructure.h:1925
uint32 DependsOnRank
Definition DBCStructure.h:1931
uint32 DependsOn
Definition DBCStructure.h:1929

References TalentEntry::DependsOn, TalentEntry::DependsOnRank, CreatureTemplate::family, Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), Object::GetGUID(), GetPet(), Pet::HasSpell(), Pet::learnSpell(), LOG_DEBUG, LOG_ERROR, MAX_PET_TALENT_RANK, MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, TalentEntry::RankID, TalentEntry::Row, sCreatureFamilyStore, Pet::SetFreeTalentPoints(), sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by WorldSession::HandleLearnPreviewTalentsPet(), and WorldSession::HandlePetLearnTalent().

◆ learnQuestRewardedSpells() [1/2]

void Player::learnQuestRewardedSpells ( )
12017{
12018 // learn spells received from quest completing
12019 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
12020 {
12021 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
12022 if (!quest)
12023 continue;
12024
12026 }
12027}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11985{
11986 // xinef: quest does not learn anything
11987 int32 spellId = quest->GetRewSpellCast();
11988 if (!spellId)
11989 return;
11990
11991 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
11992 if (!spellInfo)
11993 return;
11994
11995 // xinef: find effect with learn spell and check if we have this spell
11996 bool found = false;
11997 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
11998 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
11999 {
12000 // pusywizard: don't re-add profession specialties!
12001 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
12002 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
12003 break; // pussywizard: break and not cast the spell (found is false)
12004
12005 found = true;
12006 break;
12007 }
12008
12009 // xinef: we know the spell, return
12010 if (!found)
12011 return;
12012
12013 CastSpell(this, spellId, true);
12014}
@ SPELL_EFFECT_TRADE_SKILL
Definition SharedDefines.h:825

References Unit::CastSpell(), SpellInfo::Effects, Quest::GetRewSpellCast(), HasSpell(), MAX_SPELL_EFFECTS, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_TRADE_SKILL, and sSpellMgr.

◆ learnSkillRewardedSpells()

void Player::learnSkillRewardedSpells ( uint32  id,
uint32  value 
)
12030{
12031 uint32 raceMask = getRaceMask();
12032 uint32 classMask = getClassMask();
12033 for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(skill_id))
12034 {
12035 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
12036 if (!spellInfo)
12037 {
12038 continue;
12039 }
12040
12041 if (pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
12042 {
12043 continue;
12044 }
12045
12046 // Check race if set
12047 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
12048 {
12049 continue;
12050 }
12051
12052 // Check class if set
12053 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
12054 {
12055 continue;
12056 }
12057
12058 // need unlearn spell
12059 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
12060 {
12061 removeSpell(pAbility->Spell, GetActiveSpec(), true);
12062 }
12063 // need learn
12064 else
12065 {
12066 //used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
12067 if (pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && pAbility->SupercededBySpell)
12068 {
12069 bool skipCurrent = false;
12070 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
12071 for (auto itr = bounds.first; itr != bounds.second; ++itr)
12072 {
12073 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
12074 {
12075 skipCurrent = true;
12076 break;
12077 }
12078 }
12079 if (skipCurrent)
12080 {
12081 continue;
12082 }
12083 }
12084
12085 if (!IsInWorld())
12086 {
12087 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
12088 }
12089 else
12090 {
12091 learnSpell(pAbility->Spell, true, true);
12092 }
12093 }
12094 }
12095}
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition DBCEnums.h:360
const std::vector< SkillLineAbilityEntry const * > & GetSkillLineAbilitiesBySkillLine(uint32 skillLine)
Definition DBCStores.cpp:916
Definition DBCStructure.h:1597

References addSpell(), GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), GetSkillLineAbilitiesBySkillLine(), Object::IsInWorld(), learnSpell(), removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SPEC_MASK_ALL, and sSpellMgr.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3305{
3306 // Xinef: don't allow to learn active spell once more
3307 if (HasActiveSpell(spellId))
3308 {
3309 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3310 return;
3311 }
3312
3313 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3314 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3315 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3316 if (added)
3317 {
3318 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3319
3320 // pussywizard: a system message "you have learnt spell X (rank Y)"
3321 if (IsInWorld())
3322 SendLearnPacket(spellId, true);
3323 }
3324
3325 // pussywizard: rank stuff at the end!
3326 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3327 {
3328 // pussywizard: lookup next rank in m_spells (the only talents on m_spella are for example pyroblast, that have all ranks restored upon learning rank 1)
3329 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3330 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3331 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3332 learnSpell(nextSpell, temporary);
3333 }
3334
3335 // xinef: if we learn new spell, check all spells requiring this spell, if we have such a spell, and it is not in current spec - learn it
3336 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3337 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3338 {
3339 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3340 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3341 learnSpell(itr2->first, temporary);
3342 }
3343}
uint32 GetTalentSpellCost(uint32 spellId)
Definition DBCStores.cpp:686

References addSpell(), GetActiveSpecMask(), Object::GetGUID(), GetTalentSpellCost(), HasActiveSpell(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, m_activeSpec, m_spells, PLAYERSPELL_REMOVED, SendLearnPacket(), SPEC_MASK_ALL, sScriptMgr, sSpellMgr, and Position::ToString().

Referenced by _addSpell(), Spell::EffectLearnSpell(), learn_commandscript::HandleLearnAllGMCommand(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllMySpellsCommand(), learn_commandscript::HandleLearnSkillRecipesHelper(), Acore::PlayerCommand::HandleLearnSpellCommand(), spell_gen_profession_research::HandleScript(), spell_item_book_of_glyph_mastery::HandleScript(), WorldSession::HandleTrainerBuySpellOpcode(), LearnCustomSpells(), learnSkillRewardedSpells(), learnSpell(), learnSpellHighRank(), LearnTalent(), and UpdateCraftSkill().

◆ learnSpellHighRank()

void Player::learnSpellHighRank ( uint32  spellid)
13705{
13706 learnSpell(spellid);
13707
13708 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13709 learnSpellHighRank(next);
13710}
void learnSpellHighRank(uint32 spellid)
Definition Player.cpp:13704

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13982{
13983 uint32 CurTalentPoints = GetFreeTalentPoints();
13984
13985 if (!command)
13986 {
13987 // xinef: check basic data
13988 if (!CurTalentPoints)
13989 {
13990 return;
13991 }
13992
13993 if (talentRank >= MAX_TALENT_RANK)
13994 {
13995 return;
13996 }
13997 }
13998
13999 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14000 if (!talentInfo)
14001 return;
14002
14003 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14004 if (!talentTabInfo)
14005 return;
14006
14007 // xinef: prevent learn talent for different class (cheating)
14008 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
14009 return;
14010
14011 // xinef: find current talent rank
14012 uint32 currentTalentRank = 0;
14013 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
14014 {
14015 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
14016 {
14017 currentTalentRank = rank + 1;
14018 break;
14019 }
14020 }
14021
14022 // xinef: we already have same or higher rank talent learned
14023 if (currentTalentRank >= talentRank + 1)
14024 return;
14025
14026 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
14027 if (!command)
14028 {
14029 // xinef: check if we have enough free talent points
14030 if (CurTalentPoints < talentPointsChange)
14031 {
14032 return;
14033 }
14034 }
14035
14036 // xinef: check if talent deponds on another talent
14037 if (talentInfo->DependsOn > 0)
14038 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14039 {
14040 bool hasEnoughRank = false;
14041 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14042 {
14043 if (depTalentInfo->RankID[rank] != 0)
14044 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
14045 {
14046 hasEnoughRank = true;
14047 break;
14048 }
14049 }
14050
14051 // xinef: does not have enough talent points spend in required talent
14052 if (!hasEnoughRank)
14053 return;
14054 }
14055
14056 if (!command)
14057 {
14058 // xinef: check amount of points spent in current talent tree
14059 // xinef: be smart and quick
14060 uint32 spentPoints = 0;
14061 if (talentInfo->Row > 0)
14062 {
14063 const PlayerTalentMap& talentMap = GetTalentMap();
14064 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14065 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14066 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
14067 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
14068 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
14069 spentPoints += talentPos->rank + 1;
14070 }
14071
14072 // xinef: we do not have enough talent points to add talent of this tier
14073 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
14074 return;
14075 }
14076
14077 // xinef: hacking attempt, tries to learn unknown rank
14078 uint32 spellId = talentInfo->RankID[talentRank];
14079 if (spellId == 0)
14080 return;
14081
14082 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
14083 if (!spellInfo)
14084 return;
14085
14086 bool learned = false;
14087
14088 // xinef: if talent info has special marker in dbc - add to spell book
14089 if (talentInfo->addToSpellBook)
14090 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
14091 {
14092 learnSpell(spellId);
14093 learned = true;
14094 }
14095
14096 if (!learned)
14097 SendLearnPacket(spellId, true);
14098
14099 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
14100 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
14101 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
14102 learnSpell(spellInfo->Effects[i].TriggerSpell);
14103
14104 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
14105
14106 if (!command)
14107 {
14108 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
14109 }
14110
14111 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
14112}
uint32 ClassMask
Definition DBCStructure.h:1945

References addTalent(), TalentEntry::addToSpellBook, TalentTabEntry::ClassMask, TalentEntry::DependsOn, TalentEntry::DependsOnRank, SpellInfo::Effects, GetActiveSpec(), GetActiveSpecMask(), Unit::getClassMask(), GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasTalent(), learnSpell(), MAX_SPELL_EFFECTS, MAX_TALENT_RANK, PLAYERSPELL_REMOVED, TalentEntry::RankID, TalentEntry::Row, SendLearnPacket(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by learn_commandscript::HandleLearnAllMyTalentsCommand(), WorldSession::HandleLearnPreviewTalents(), and WorldSession::HandleLearnTalentOpcode().

◆ LeaveAllArenaTeams()

void Player::LeaveAllArenaTeams ( ObjectGuid  guid)
static
10214{
10215 // xinef: sync query
10217 stmt->SetData(0, guid.GetCounter());
10218 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10219
10220 if (!result)
10221 return;
10222
10223 do
10224 {
10225 Field* fields = result->Fetch();
10226 uint32 arenaTeamId = fields[0].Get<uint32>();
10227 if (arenaTeamId != 0)
10228 {
10229 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10230 if (arenaTeam)
10231 arenaTeam->DelMember(guid, true);
10232 }
10233 } while (result->NextRow());
10234}
@ CHAR_SEL_PLAYER_ARENA_TEAMS
Definition CharacterDatabase.h:231
void DelMember(ObjectGuid guid, bool cleanDb)
Definition ArenaTeam.cpp:324

References CHAR_SEL_PLAYER_ARENA_TEAMS, CharacterDatabase, ArenaTeam::DelMember(), Field::Get(), ObjectGuid::GetCounter(), sArenaTeamMgr, and PreparedStatementBase::SetData().

Referenced by DeleteFromDB(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ LeaveBattleground()

void Player::LeaveBattleground ( Battleground bg = nullptr)
11359{
11360 if (!bg)
11361 bg = GetBattleground();
11362
11363 if (!bg)
11364 return;
11365
11366 // Deserter tracker - leave BG
11367 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11368 {
11369 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11370 {
11372 stmt->SetData(0, GetGUID().GetCounter());
11374 CharacterDatabase.Execute(stmt);
11375 }
11376 sScriptMgr->OnBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11377 }
11378
11379 if (bg->isArena() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11380 sScriptMgr->OnBattlegroundDesertion(this, ARENA_DESERTION_TYPE_LEAVE_BG);
11381
11382 // xinef: reset corpse reclaim time
11384
11385 // Remove all dots
11389
11390 // pussywizard: clear movement, because after porting player will move to arena cords
11392 StopMoving();
11394}
@ BG_DESERTION_TYPE_LEAVE_BG
Definition Battleground.h:51
@ ARENA_DESERTION_TYPE_LEAVE_BG
Definition Battleground.h:56
@ STATUS_WAIT_JOIN
Definition Battleground.h:201
@ CHAR_INS_DESERTER_TRACK
Definition CharacterDatabase.h:499
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition IWorld.h:116
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116
bool isBattleground() const
Definition Battleground.h:414
BattlegroundStatus GetStatus() const
Definition Battleground.h:332
void MovementExpired(bool reset=true)
Definition MotionMaster.h:180
bool TeleportToEntryPoint()
Definition Player.cpp:1601
void StopMoving()
Definition Unit.cpp:16716

References ARENA_DESERTION_TYPE_LEAVE_BG, BG_DESERTION_TYPE_LEAVE_BG, CHAR_INS_DESERTER_TRACK, CharacterDatabase, CONFIG_BATTLEGROUND_TRACK_DESERTERS, GetBattleground(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetMotionMaster(), Battleground::GetStatus(), Battleground::isArena(), Battleground::isBattleground(), m_deathExpireTime, MotionMaster::MovementExpired(), Unit::RemoveAurasByType(), PreparedStatementBase::SetData(), SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_LEECH, sScriptMgr, STATUS_IN_PROGRESS, STATUS_WAIT_JOIN, Unit::StopMoving(), sWorld, and TeleportToEntryPoint().

Referenced by BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::LogoutPlayer(), and ToggleAFK().

◆ LeftChannel()

void Player::LeftChannel ( Channel c)
5019{
5020 m_channels.remove(c);
5021}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15311{
15312 if (result)
15313 _LoadActions(result);
15314
15316}
void _LoadActions(PreparedQueryResult result)
Definition PlayerStorage.cpp:5673

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5816{
5818 SpawnCorpseBones(false);
5819
5820 if (!IsAlive())
5821 {
5822 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5823 {
5824 Field* fields = result->Fetch();
5825 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5827 }
5828 else
5829 ResurrectPlayer(0.5f);
5830 }
5831
5833}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition Player.cpp:14674
bool HasAtLoginFlag(AtLoginFlags f) const
Definition Player.h:2410
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4492

References _corpseLocation, Object::ApplyModFlag(), AT_LOGIN_RESURRECT, WorldLocation::GetMapId(), HasAtLoginFlag(), Unit::IsAlive(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, RemoveAtLoginFlag(), ResurrectPlayer(), sMapStore, SpawnCorpseBones(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadFromDB()

bool Player::LoadFromDB ( ObjectGuid  guid,
CharacterDatabaseQueryHolder const &  holder 
)
4919{
4921 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4922 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4923 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4924 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4925 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
4926 // 44 45 46 47 48 49 50 51 52 53 54
4927 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4928 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4929 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4930 // 70 71 72 73 74
4931 //"actionBars, grantableLevels, innTriggerId, extraBonusTalentCount, UNIX_TIMESTAMP(creation_date) FROM characters WHERE guid = '{}'", guid);
4932 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4933
4934 if (!result)
4935 {
4936 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4937 return false;
4938 }
4939
4940 Field* fields = result->Fetch();
4941
4942 uint32 dbAccountId = fields[1].Get<uint32>();
4943
4944 // check if the character's account in the db and the logged in account match.
4945 // player should be able to load/delete character only with correct account!
4946 if (dbAccountId != GetSession()->GetAccountId())
4947 {
4948 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4949 return false;
4950 }
4951
4952 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4953 {
4954 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4955 return false;
4956 }
4957
4958 ObjectGuid::LowType guid = playerGuid.GetCounter();
4959
4961
4962 m_name = fields[2].Get<std::string>();
4963
4964 // check name limitations
4966 {
4968 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4969 stmt->SetData(1, guid);
4970 CharacterDatabase.Execute(stmt);
4971 return false;
4972 }
4973
4974 uint8 Gender = fields[5].Get<uint8>();
4975 if (!IsValidGender(Gender))
4976 {
4977 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
4978 return false;
4979 }
4980
4981 // overwrite some data fields
4982 uint32 bytes0 = 0;
4983 bytes0 |= fields[3].Get<uint8>(); // race
4984 bytes0 |= fields[4].Get<uint8>() << 8; // class
4985 bytes0 |= Gender << 16; // gender
4987
4988 m_realRace = fields[3].Get<uint8>(); // set real race
4989 m_race = fields[3].Get<uint8>(); // set real race
4990
4991 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
4992 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
4993
4994 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
4995 {
4996 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
4997 }
4998
4999 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5000 {
5001 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5002 }
5003
5004 SetObjectScale(1.0f);
5006
5007 // load character creation date, relevant for achievements of type average
5008 SetCreationTime(fields[74].Get<Seconds>());
5009
5010 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5012
5013 uint32 money = fields[8].Get<uint32>();
5014 if (money > MAX_MONEY_AMOUNT)
5015 money = MAX_MONEY_AMOUNT;
5016 SetMoney(money);
5017
5018 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5019 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5020 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5021 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5022 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5023 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5024 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5025 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5026 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5027 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5028 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5029
5030 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5031
5032 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5033
5034 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5035 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5036
5038
5039 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5040 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5041 {
5043 SetVisibleItemSlot(slot, nullptr);
5044
5045 delete m_items[slot];
5046 m_items[slot] = nullptr;
5047 }
5048
5049 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5051
5052 //Need to call it to initialize m_team (m_team can be calculated from race)
5053 //Other way is to saves m_team into characters table.
5055
5056 // pussywizard: create empty instance bind containers if necessary
5057 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5058
5059 // load home bind and check in same time class/race pair, it used later for restore broken positions
5060 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5061 return false;
5062
5063 InitPrimaryProfessions(); // to max set before any spell loaded
5064
5065 // init saved position, and fix it later if problematic
5066 int32 transLowGUID = fields[35].Get<int32>();
5067 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5068 uint32 mapId = fields[20].Get<uint16>();
5069 uint32 instanceId = fields[63].Get<uint32>();
5070
5071 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5072 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5073 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5074 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5075 if (raidDiff >= MAX_RAID_DIFFICULTY)
5077 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5078 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5079
5080 std::string taxi_nodes = fields[42].Get<std::string>();
5081
5082 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); };
5083
5084 _LoadGroup();
5085
5087
5088 SetArenaPoints(fields[44].Get<uint32>());
5089
5090 SetHonorPoints(fields[45].Get<uint32>());
5091 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5092 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5093 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5094 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5095 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5096
5099
5100 GetSession()->SetPlayer(this);
5101 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5102
5103 Map* map = nullptr;
5104
5105 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5106 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5107 {
5108 bool fixed = false;
5109 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5110 {
5111 instanceId = destInstId;
5112 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5113 {
5114 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5115 fixed = true;
5116 }
5117 }
5118 if (!fixed)
5119 {
5120 RelocateToHomebind();
5121 mapEntry = sMapStore.LookupEntry(mapId);
5122 }
5123 }
5124
5125 if (!mapEntry || !IsPositionValid())
5126 {
5127 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (MapId: {} X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5128 RelocateToHomebind();
5129 }
5130 // Player was saved in Arena or Bg
5131 else if (mapEntry->IsBattlegroundOrArena())
5132 {
5133 // xinef: resurrect player, cant log in dead without corpse
5134 {
5137 if (!IsAlive())
5138 ResurrectPlayer(1.0f);
5139 }
5140
5141 const WorldLocation& _loc = GetEntryPoint();
5142 mapId = _loc.GetMapId();
5143 instanceId = 0;
5144
5145 if (mapId == MAPID_INVALID)
5146 {
5147 RelocateToHomebind();
5148 }
5149 else
5150 {
5151 Relocate(&_loc);
5152
5153 // xinef: restore taxi flight from entry point data
5155 {
5159 }
5160 }
5161 }
5162 // currently we do not support transport in bg
5163 else if (transLowGUID != 0)
5164 {
5165 // transLowGUID > 0 ---> motion transport guid
5166 // transLowGUID < 0 ---> static transport spawn id
5167 Transport* transGO = nullptr;
5168 if (transLowGUID > 0)
5169 {
5170 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5171 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5172 }
5173 else
5174 {
5175 map = sMapMgr->CreateMap(mapId, this);
5176 if (map)
5177 {
5178 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5179 if (bounds.first != bounds.second)
5180 transGO = bounds.first->second->ToTransport();
5181 }
5182 }
5183
5184 // pussywizard: must be on map, for one world tick transport is not in map and has old GetMapId(), player would be added to old map and to the transport, multithreading crashfix
5185 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5186 m_transport = transGO;
5187
5188 if (m_transport)
5189 {
5190 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5194
5195 if (!Acore::IsValidMapCoord(x, y, z, o) || std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 75.0f)
5196 {
5197 m_transport = nullptr;
5200 RelocateToHomebind();
5201 }
5202 else
5203 {
5204 Relocate(x, y, z, o);
5205 mapId = m_transport->GetMapId();
5208 }
5209 }
5210 else
5211 {
5212 bool fixed = false;
5213 if (mapEntry->Instanceable())
5214 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5215 {
5216 fixed = true;
5217 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5218 }
5219 if (!fixed)
5220 RelocateToHomebind();
5221 }
5222 }
5223 // currently we do not support taxi in instance
5224 else if (!taxi_nodes.empty())
5225 {
5226 instanceId = 0;
5227 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5228 {
5229 // xinef: could no load valid data for taxi, relocate to homebind and clear
5231 RelocateToHomebind();
5232 }
5233 }
5234
5235 // Map could be changed before
5236 mapEntry = sMapStore.LookupEntry(mapId);
5237 // client without expansion support
5238 if (mapEntry)
5239 {
5240 if (GetSession()->Expansion() < mapEntry->Expansion())
5241 {
5242 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5243 RelocateToHomebind();
5244 }
5245
5246 // check whether player was unbound or is bound to another instance
5247 if (instanceId)
5248 {
5249 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5250 if (!save || save->GetInstanceId() != instanceId)
5251 instanceId = 0;
5252 }
5253 }
5254
5255 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5256 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5257 {
5258 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5259 if (at)
5261 else
5262 RelocateToHomebind();
5263 }
5264
5265 // NOW player must have valid map
5266 // load the player's map here if it's not already loaded
5267 if (!map)
5268 map = sMapMgr->CreateMap(mapId, this);
5269
5270 if (!map)
5271 {
5272 instanceId = 0;
5273 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5274 if (at)
5275 {
5276 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5278 mapId = at->target_mapId;
5279 }
5280 else
5281 {
5282 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5283 RelocateToHomebind();
5284 }
5285
5286 map = sMapMgr->CreateMap(mapId, this);
5287 if (!map)
5288 {
5289 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5290 mapId = info->mapId;
5291 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5292 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5293 map = sMapMgr->CreateMap(mapId, this);
5294 if (!map)
5295 {
5296 LOG_ERROR("entities.player", "Player (guidlow {}) has invalid default map coordinates (X: {} Y: {} Z: {} O: {}). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5297 return false;
5298 }
5299 }
5300 }
5301
5302 SetMap(map);
5304
5306
5308
5309 time_t now = GameTime::GetGameTime().count();
5310 time_t logoutTime = time_t(fields[27].Get<uint32>());
5311
5312 // since last logout (in seconds)
5313 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5314
5315 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5316 // this must help in case next save after mass player load after server startup
5317 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5318
5319 // set value, including drunk invisibility detection
5320 // calculate sobering. after 15 minutes logged out, the player will be sober again
5321 uint8 newDrunkValue = 0;
5322 if (time_diff < uint32(GetDrunkValue()) * 9)
5323 newDrunkValue = GetDrunkValue() - time_diff / 9;
5324
5325 SetDrunkValue(newDrunkValue);
5326
5327 m_cinematic = fields[23].Get<uint8>();
5328 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5329 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5330
5331 m_resetTalentsCost = fields[29].Get<uint32>();
5332 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5333
5334 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5335
5336 uint32 extraflags = fields[36].Get<uint16>();
5337
5338 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5339
5340 m_atLoginFlags = fields[38].Get<uint16>();
5341
5343 {
5344 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5345 return false;
5346 }
5347
5348 // Honor system
5349 // Update Honor kills data
5350 m_lastHonorUpdateTime = logoutTime;
5352
5353 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5354
5357
5358 // clear channel spell data (if saved at channel spell casting)
5361
5362 // clear charm/summon related fields
5369
5371
5372 // reset some aura modifiers before aura apply
5375
5376 // make sure the unit is considered not in duel for proper loading
5379
5380 // reset stats before loading any modifiers
5384 InitRunes();
5385
5386 sScriptMgr->OnPlayerLoadFromDB(this);
5387
5388 // make sure the unit is considered out of combat for proper loading
5389 ClearInCombat();
5390
5391 // rest bonus can only be calculated after InitStatsForLevel()
5392 _restBonus = fields[26].Get<float>();
5393
5394 if (time_diff > 0)
5395 {
5396 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5397 float bubble0 = 0.031f;
5398 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5399 float bubble1 = 0.125f;
5400 float bubble = fields[28].Get<uint8>() > 0
5401 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5402 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5403
5404 // Client automatically doubles the value sent so we have to divide it by 2
5405 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5406 }
5407
5408 uint32 innTriggerId = fields[72].Get<uint32>();
5409 if (innTriggerId)
5410 {
5411 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5412 }
5413
5414 // load skills after InitStatsForLevel because it triggering aura apply also
5415 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5416 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5417
5418 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5419
5420 m_specsCount = fields[64].Get<uint8>();
5421 m_activeSpec = fields[65].Get<uint8>();
5422
5425
5426 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5427 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5428
5429 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5431 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5432 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5434 {
5437 }
5438
5439 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5441
5442 // after spell load, learn rewarded spell if need also
5443 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5449 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5450
5451 // Extra Bonus Talent Points
5452 m_extraBonusTalentCount = fields[73].Get<uint8>();
5453
5454 // after spell, bonus talents, and quest load
5456
5457 // must be before inventory (some items required reputation check)
5459
5460 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5461 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5462
5463 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5464
5465 // update items with duration and realtime
5466 UpdateItemDuration(time_diff, true);
5467
5468 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5469
5470 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5471
5472 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5473 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5474 uint32 curTitle = fields[51].Get<uint32>();
5475 if (curTitle && !HasTitle(curTitle))
5476 curTitle = 0;
5477
5479
5480 // has to be called after last Relocate() in Player::LoadFromDB
5482
5484
5485 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5486 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5487 if (!IsAlive())
5489 else
5491
5492 //apply all stat bonuses from items and auras
5493 SetCanModifyStats(true);
5495
5496 // restore remembered power/health values (but not more max values)
5497 uint32 savedHealth = fields[55].Get<uint32>();
5498 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5499 for (uint8 i = 0; i < MAX_POWERS; ++i)
5500 {
5501 uint32 savedPower = fields[56 + i].Get<uint32>();
5502 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5503 }
5504
5505 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5507
5508 // GM state
5510 {
5511 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5512 {
5513 default:
5514 case 0:
5515 break; // disable
5516 case 1:
5517 SetGameMaster(true);
5518 break; // enable
5519 case 2: // save state
5520 if (extraflags & PLAYER_EXTRA_GM_ON)
5521 SetGameMaster(true);
5522 break;
5523 }
5524
5525 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5526 {
5527 default:
5528 case 0:
5529 SetGMVisible(false);
5530 break; // invisible
5531 case 1:
5532 break; // visible
5533 case 2: // save state
5534 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5535 SetGMVisible(false);
5536 break;
5537 }
5538
5539 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5540 {
5541 default:
5542 case 0:
5543 break; // disable
5544 case 1:
5545 SetGMChat(true);
5546 break; // enable
5547 case 2: // save state
5548 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5549 SetGMChat(true);
5550 break;
5551 }
5552
5553 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5554 {
5555 default:
5556 case 0:
5557 break; // disable
5558 case 1:
5559 SetAcceptWhispers(true);
5560 break; // enable
5561 case 2: // save state
5562 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5563 SetAcceptWhispers(true);
5564 break;
5565 }
5566 }
5567
5568 // RaF stuff.
5569 m_grantableLevels = fields[71].Get<uint8>();
5570 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5572
5573 if (m_grantableLevels > 0)
5575
5577
5578 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5579
5581
5583
5585
5586 // Players are immune to taunt
5589
5590 // Init charm info
5592
5593 // Fix aurastate auras, depending on health!
5594 // Set aurastate manualy, prevents aura switching
5595 if (HealthBelowPct(20))
5597 if (HealthBelowPct(35))
5599 if (HealthAbovePct(75))
5601
5602 // unapply aura stats if dont meet requirements
5603 AuraApplicationMap const& Auras = GetAppliedAuras();
5604 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5605 {
5606 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5607 Aura* aura = itr->second->GetBase();
5608 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5612 continue;
5613
5614 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5615 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5616 }
5617 return true;
5618}
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition CharacterDatabase.h:274
#define MAX_RAID_DIFFICULTY
Definition DBCEnums.h:282
#define MAX_DUNGEON_DIFFICULTY
Definition DBCEnums.h:281
@ CONFIG_GM_CHAT
Definition IWorld.h:257
@ CONFIG_GM_WHISPERING_TO
Definition IWorld.h:258
@ CONFIG_GM_LOGIN_STATE
Definition IWorld.h:254
@ CONFIG_GM_VISIBLE_STATE
Definition IWorld.h:255
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition IWorld.h:504
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition IWorld.h:503
@ REST_FLAG_IN_TAVERN
Definition Player.h:819
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition Player.h:887
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition Player.h:894
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition Player.h:873
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition Player.h:900
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition Player.h:895
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition Player.h:896
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition Player.h:890
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition Player.h:878
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition Player.h:901
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition Player.h:898
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition Player.h:869
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES
Definition Player.h:902
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition Player.h:891
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition Player.h:897
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition Player.h:877
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition Player.h:893
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition Player.h:884
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition Player.h:871
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition Player.h:892
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition Player.h:883
@ SPELL_EFFECT_ATTACK_ME
Definition SharedDefines.h:892
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3419
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition SharedDefines.h:3127
@ IMMUNITY_STATE
Definition SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1394
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition SpellDefines.h:62
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:374
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition UnitDefines.h:295
@ UNIT_STATE_ISOLATED
Definition UnitDefines.h:183
@ UNIT_FIELD_CHANNEL_OBJECT
Definition UpdateFields.h:93
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87
@ UNIT_FIELD_CHARMEDBY
Definition UpdateFields.h:89
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
@ PLAYER_TRACK_CREATURES
Definition UpdateFields.h:344
@ PLAYER_TRACK_RESOURCES
Definition UpdateFields.h:345
@ UNIT_CHANNEL_SPELL
Definition UpdateFields.h:94
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult)
Definition AchievementMgr.cpp:617
Transport * ToTransport()
Definition GameObject.h:320
static T * Find(ObjectGuid guid)
Definition ObjectAccessor.cpp:53
uint32 GetInstanceId() const
Definition InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition Map.h:521
static uint8 CheckPlayerName(std::string_view name, bool create=false)
Definition ObjectMgr.cpp:8468
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:123
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition Object.cpp:612
bool LoadTaxiMask(std::string_view data)
Definition PlayerTaxi.cpp:89
bool LoadTaxiDestinationsFromString(std::string const &values, TeamId teamId)
Definition PlayerTaxi.cpp:130
void _LoadDeclinedNames(PreparedQueryResult result)
Definition PlayerStorage.cpp:4785
void _LoadGlyphs(PreparedQueryResult result)
Definition Player.cpp:14994
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition Player.cpp:16186
void SetCreationTime(Seconds creationTime)
Definition Player.h:2546
void SetGameMaster(bool on)
Definition Player.cpp:2229
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition PlayerStorage.cpp:6315
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition PlayerStorage.cpp:5700
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6423
void _LoadGroup()
Definition PlayerStorage.cpp:6481
void _LoadCharacterSettings(PreparedQueryResult result)
Definition PlayerSettings.cpp:26
void _LoadTalents(PreparedQueryResult result)
Definition Player.cpp:15043
void SetFallInformation(uint32 time, float z)
Definition Player.h:2344
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition Player.cpp:15855
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition Player.cpp:15818
WorldLocation const & GetEntryPoint() const
Definition Player.h:2385
void outDebugValues() const
Definition PlayerStorage.cpp:7782
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition Player.cpp:15753
void SaveRecallPosition()
Definition Player.cpp:5681
void _LoadQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6228
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6446
void SetGMChat(bool on)
Definition Player.h:1178
void _LoadArenaTeamInfo()
Definition PlayerStorage.cpp:4796
bool _LoadHomeBind(PreparedQueryResult result)
Definition PlayerStorage.cpp:6988
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition PlayerStorage.cpp:4145
void _LoadSpells(PreparedQueryResult result)
Definition PlayerStorage.cpp:6468
void _LoadSkills(PreparedQueryResult result)
Definition Player.cpp:13712
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition PlayerStorage.cpp:6155
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6401
void SetGMVisible(bool on)
Definition Player.cpp:2298
void PrepareCharmAISpells()
Definition Player.cpp:15449
void _LoadGlyphAuras()
Definition PlayerStorage.cpp:5783
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition Player.h:1128
void _LoadEquipmentSets(PreparedQueryResult result)
Definition PlayerStorage.cpp:4827
void _LoadEntryPointData(PreparedQueryResult result)
Definition PlayerStorage.cpp:4858
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition Player.cpp:15806
void StoreRaidMapDifficulty()
Definition Player.h:1933
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition PlayerStorage.cpp:5835
void UpdateHonorFields()
Definition PlayerUpdates.cpp:1177
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition Player.cpp:3600
void SetMoney(uint32 value)
Definition Player.h:1626
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6350
void LoadFromDB(PreparedQueryResult result)
Definition ReputationMgr.cpp:561
uint32 CasterAuraState
Definition SpellInfo.h:339
virtual void AddPassenger(WorldObject *passenger, bool withAll=false)=0
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition Transport.h:32
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1048
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13448
void RemoveAllAurasRequiringDeadTarget()
Definition Unit.cpp:5405
DeathState m_deathState
Definition Unit.h:2067
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5382
void AddUnitState(uint32 f)
Definition Unit.h:706
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1046
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:743
void RemoveUnitFlag2(UnitFlags2 flags)
Definition Unit.h:726
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10632
void ClearInCombat()
Definition Unit.cpp:13875
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:687
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1718
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5214
Transport * m_transport
Definition Object.h:654
void SetPlayer(Player *player)
Definition WorldSession.cpp:1273
bool IsARecruiter() const
Definition WorldSession.h:541
bool IsValidMapCoord(float c)
Definition GridDefines.h:215
Definition ObjectMgr.h:411
float target_Z
Definition ObjectMgr.h:415
float target_X
Definition ObjectMgr.h:413
float target_Orientation
Definition ObjectMgr.h:416
float target_Y
Definition ObjectMgr.h:414
uint32 target_mapId
Definition ObjectMgr.h:412
void ClearTaxiPath()
Definition Player.h:1064
bool HasTaxiPath() const
Definition Player.h:1065
bool IsNonRaidDungeon() const
Definition DBCStructure.h:1351
uint32 Expansion() const
Definition DBCStructure.h:1348
bool IsBattlegroundOrArena() const
Definition DBCStructure.h:1356
bool IsDungeon() const
Definition DBCStructure.h:1350
bool IsRaid() const
Definition DBCStructure.h:1353
bool Instanceable() const
Definition DBCStructure.h:1352
void Reset()
Definition Object.h:292
ObjectGuid guid
Definition Object.h:301
Position pos
Definition Object.h:302
void RemoveMovementFlag(uint32 flag)
Definition Object.h:338
struct MovementInfo::TransportInfo transport
bool IsPositionValid() const
Definition Position.cpp:176

References Object::_Create(), _LoadActions(), _LoadArenaTeamInfo(), _LoadAuras(), _LoadBrewOfTheMonth(), _LoadCharacterSettings(), _LoadDailyQuestStatus(), _LoadDeclinedNames(), _LoadEntryPointData(), _LoadEquipmentSets(), _LoadGlyphAuras(), _LoadGlyphs(), _LoadGroup(), _LoadHomeBind(), _LoadInstanceTimeRestrictions(), Object::_LoadIntoDataField(), _LoadInventory(), _LoadMail(), _LoadMonthlyQuestStatus(), _LoadPetStable(), _LoadQuestStatus(), _LoadQuestStatusRewarded(), _LoadRandomBGStatus(), _LoadSeasonalQuestStatus(), _LoadSkills(), _LoadSpellCooldowns(), _LoadSpells(), _LoadTalents(), _LoadWeeklyQuestStatus(), _restBonus, Transport::AddPassenger(), PlayerTaxi::AddTaxiDestination(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Unit::ApplySpellImmune(), AT_LOGIN_RENAME, AURA_EFFECT_HANDLE_REAL, AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Transport::CalculatePassengerPosition(), SpellInfo::CasterAuraState, CHAR_NAME_SUCCESS, CHAR_UPD_ADD_AT_LOGIN_FLAG, CharacterDatabase, ObjectMgr::CheckPlayerName(), Unit::ClearInCombat(), PlayerTaxi::ClearTaxiDestinations(), EntryPointData::ClearTaxiPath(), CONFIG_GM_CHAT, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, CONFIG_GM_WHISPERING_TO, Dead, DEATH_EXPIRE_STEP, DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, MapEntry::Expansion(), HashMapHolder< T >::Find(), WorldObject::FindMap(), Field::Get(), WorldSession::GetAccountId(), Unit::GetAppliedAuras(), Unit::getClass(), ObjectGuid::GetCounter(), GetDifficulty(), GetDrunkValue(), GetDungeonDifficulty(), GetEntryPoint(), Map::GetGameObjectBySpawnIdStore(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), InstanceSave::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Unit::GetMaxPower(), WorldObject::GetName(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), SQLQueryHolderBase::GetPreparedResult(), Unit::getRace(), GetRaidDifficulty(), WorldSession::GetRecruiterId(), GetRestBonus(), GetSession(), Aura::GetSpellInfo(), GetTeamId(), Object::GetUInt32Value(), MovementInfo::TransportInfo::guid, Aura::HandleAllEffects(), HasAtLoginFlag(), Unit::HasAuraState(), HasPlayerFlag(), Unit::HasSpiritOfRedemptionAura(), EntryPointData::HasTaxiPath(), HasTitle(), Unit::HealthAbovePct(), Unit::HealthBelowPct(), IMMUNITY_EFFECT, IMMUNITY_STATE, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), MapEntry::Instanceable(), Unit::IsAlive(), WorldSession::IsARecruiter(), MapEntry::IsBattlegroundOrArena(), MapEntry::IsDungeon(), Object::IsInWorld(), MapEntry::IsNonRaidDungeon(), AccountMgr::IsPlayerAccount(), Position::IsPositionValid(), MapEntry::IsRaid(), IsValidGender(), Acore::IsValidMapCoord(), KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), AchievementMgr::LoadFromDB(), ReputationMgr::LoadFromDB(), PlayerTaxi::LoadTaxiDestinationsFromString(), PlayerTaxi::LoadTaxiMask(), LOG_DEBUG, LOG_ERROR, LOG_WARN, m_achievementMgr, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, Unit::m_deathState, m_entryPointData, m_extraBonusTalentCount, m_grantableLevels, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_items, m_lastHonorUpdateTime, WorldObject::m_movementInfo, WorldObject::m_name, m_nextSave, m_Played_time, Unit::m_race, Unit::m_realRace, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_social, m_specsCount, m_taxi, WorldObject::m_transport, PlayerInfo::mapId, MAPID_INVALID, MAX_DEATH_COUNT, MAX_DUNGEON_DIFFICULTY, MAX_MONEY_AMOUNT, MAX_POWERS, MAX_RAID_DIFFICULTY, MOVEMENTFLAG_ONTRANSPORT, outDebugValues(), PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, Player, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_EXTRA_ACCEPT_WHISPERS, PLAYER_EXTRA_GM_CHAT, PLAYER_EXTRA_GM_INVISIBLE, PLAYER_EXTRA_GM_ON, PLAYER_FARSIGHT, PLAYER_FIELD_BYTES, PLAYER_FIELD_INV_SLOT_HEAD, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_GHOST, PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_ACTIONS, PLAYER_LOGIN_QUERY_LOAD_AURAS, PLAYER_LOGIN_QUERY_LOAD_BANNED, PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH, PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES, PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_FROM, PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW, PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG, PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_SKILLS, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, PLAYER_LOGIN_QUERY_LOAD_SPELLS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS, PLAYER_NEXT_LEVEL_XP, PLAYER_TRACK_CREATURES, PLAYER_TRACK_RESOURCES, PLAYER_XP, MovementInfo::TransportInfo::pos, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PrepareCharmAISpells(), RAID_DIFFICULTY_10MAN_NORMAL, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, Position::Relocate(), Unit::RemoveAllAurasOnDeath(), Unit::RemoveAllAurasRequiringDeadTarget(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Unit::RemoveUnitFlag2(), ReplaceAllPlayerFlags(), MovementInfo::TransportInfo::Reset(), REST_FLAG_IN_TAVERN, ResurrectPlayer(), SaveRecallPosition(), SetAcceptWhispers(), SetArenaPoints(), Object::SetByteValue(), Unit::SetCanModifyStats(), SetCreationTime(), Unit::SetCreatorGUID(), PreparedStatementBase::SetData(), SetDrunkValue(), SetDungeonDifficulty(), Object::SetDynamicFlag(), SetFactionForRace(), SetFallInformation(), Object::SetFlag(), Object::SetFloatValue(), SetGameMaster(), SetGMChat(), SetGMVisible(), Object::SetGuidValue(), Unit::SetHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), SetMoney(), SetObjectScale(), Unit::SetOwnerGUID(), WorldSession::SetPlayer(), Unit::SetPower(), SetRaidDifficulty(), SetRestBonus(), SetRestFlag(), Object::SetUInt16Value(), Unit::SetUInt32Value(), Object::SetUInt64Value(), SetVisibleItemSlot(), sInstanceSaveMgr, sMapMgr, sMapStore, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOD_TAUNT, SPELL_EFFECT_ATTACK_ME, sScriptMgr, sSocialMgr, StoreRaidMapDifficulty(), sWorld, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, EntryPointData::taxiPath, ObjectGuid::ToString(), Position::ToString(), GameObject::ToTransport(), MovementInfo::transport, UNIT_CHANNEL_SPELL, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_AURASTATE, UNIT_FIELD_BYTES_0, UNIT_FIELD_CHANNEL_OBJECT, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FIELD_SUMMON, UNIT_FLAG2_FORCE_MOVEMENT, UNIT_STATE_ISOLATED, UpdateAllStats(), UpdateHonorFields(), UpdateItemDuration(), WorldObject::UpdatePositionData(), UpdateSkillsForLevel(), and urand().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPet()

void Player::LoadPet ( )
6217{
6218 //fixme: the pet should still be loaded if the player is not in world
6219 // just not added to the map
6220 if (m_petStable && IsInWorld())
6221 {
6222 Pet* pet = new Pet(this);
6223 if (!pet->LoadPetFromDB(this, 0, 0, true))
6224 delete pet;
6225 }
6226}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0, bool fullMana=false)
Definition Pet.cpp:215

References Object::IsInWorld(), Pet::LoadPetFromDB(), and m_petStable.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPositionFromDB()

bool Player::LoadPositionFromDB ( uint32 mapid,
float &  x,
float &  y,
float &  z,
float &  o,
bool &  in_flight,
ObjectGuid::LowType  guid 
)
static
4876{
4878 stmt->SetData(0, guid);
4879 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4880
4881 if (!result)
4882 return false;
4883
4884 Field* fields = result->Fetch();
4885
4886 x = fields[0].Get<float>();
4887 y = fields[1].Get<float>();
4888 z = fields[2].Get<float>();
4889 o = fields[3].Get<float>();
4890 mapid = fields[4].Get<uint16>();
4891 in_flight = !fields[5].Get<std::string>().empty();
4892
4893 return true;
4894}
@ CHAR_SEL_CHAR_POSITION
Definition CharacterDatabase.h:54

References CHAR_SEL_CHAR_POSITION, CharacterDatabase, Field::Get(), and PreparedStatementBase::SetData().

Referenced by misc_commandscript::HandleAppearCommand().

◆ ModifyArenaPoints()

void Player::ModifyArenaPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)

If trans is specified, honor save query will be added to trans.

6322{
6323 int32 newValue = int32(GetArenaPoints()) + value;
6324 if (newValue < 0)
6325 newValue = 0;
6326 SetArenaPoints(uint32(newValue));
6327
6328 if (trans)
6329 {
6331 stmt->SetData(0, newValue);
6332 stmt->SetData(1, GetGUID().GetCounter());
6333 trans->Append(stmt);
6334 }
6335}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition CharacterDatabase.h:425

References CHAR_UDP_CHAR_ARENA_POINTS, CharacterDatabase, GetArenaPoints(), Object::GetGUID(), SetArenaPoints(), and PreparedStatementBase::SetData().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyArenaCommand(), RefundItem(), and RewardQuest().

◆ ModifyHonorPoints()

void Player::ModifyHonorPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)
6306{
6307 int32 newValue = int32(GetHonorPoints()) + value;
6308 if (newValue < 0)
6309 newValue = 0;
6310 SetHonorPoints(uint32(newValue));
6311
6312 if (trans)
6313 {
6315 stmt->SetData(0, newValue);
6316 stmt->SetData(1, GetGUID().GetCounter());
6317 trans->Append(stmt);
6318 }
6319}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition CharacterDatabase.h:423

References CHAR_UDP_CHAR_HONOR_POINTS, CharacterDatabase, Object::GetGUID(), GetHonorPoints(), PreparedStatementBase::SetData(), and SetHonorPoints().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyHonorCommand(), RefundItem(), and RewardHonor().

◆ ModifyMoney()

bool Player::ModifyMoney ( int32  amount,
bool  sendError = true 
)
11553{
11554 if (!amount)
11555 return true;
11556
11557 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11558
11559 if (amount < 0)
11560 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11561 else
11562 {
11563 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11564 SetMoney(GetMoney() + amount);
11565 else
11566 {
11567 if (sendError)
11568 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11569 return false;
11570 }
11571 }
11572
11573 return true;
11574}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition Item.h:123

References EQUIP_ERR_TOO_MUCH_GOLD, GetMoney(), MAX_MONEY_AMOUNT, SendEquipError(), SetMoney(), and sScriptMgr.

Referenced by _StoreOrEquipNewItem(), ActivateTaxiPathTo(), FlightPathMovementGenerator::DoUpdate(), DurabilityRepair(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyBankSlotOpcode(), Guild::HandleBuyBankTab(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), modify_commandscript::HandleModifyMoneyCommand(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), Guild::HandleSetEmblem(), WorldSession::HandleTrainerBuySpellOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), ProcessCastaction(), ProcessUnlearnAction(), RefundItem(), resetTalents(), RewardQuest(), and SetHonorPoints().

◆ ModifySkillBonus()

void Player::ModifySkillBonus ( uint32  skillid,
int32  val,
bool  talent 
)
5331{
5332 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5333 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5334 return;
5335
5336 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5337
5338 uint32 bonus_val = GetUInt32Value(bonusIndex);
5339 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5340 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5341
5342 if (talent) // permanent bonus stored in high part
5343 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5344 else // temporary/item bonus stored in low part
5345 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5346}
#define MAKE_SKILL_BONUS(t, p)
Definition Player.h:88

References Object::GetUInt32Value(), MAKE_SKILL_BONUS, mSkillStatus, PLAYER_SKILL_BONUS_INDEX, Unit::SetUInt32Value(), SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_TEMP_BONUS.

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
11131{
11132 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
11133 if (itr == m_spellCooldowns.end())
11134 return;
11135
11136 itr->second.end += cooldown;
11137
11138 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
11139 data << uint32(spellId); // Spell ID
11140 data << GetGUID(); // Player GUID
11141 data << int32(cooldown); // Cooldown mod in milliseconds
11142 GetSession()->SendPacket(&data);
11143}
@ SMSG_MODIFY_COOLDOWN
Definition Opcodes.h:1199

References Object::GetGUID(), GetSession(), m_spellCooldowns, WorldSession::SendPacket(), and SMSG_MODIFY_COOLDOWN.

◆ MoneyChanged()

void Player::MoneyChanged ( uint32  value)
2172{
2173 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2174 {
2175 uint32 questid = GetQuestSlotQuestId(i);
2176 if (!questid)
2177 continue;
2178
2179 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2180 {
2181 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2182 if (rewOrReqMoney < 0)
2183 {
2184 QuestStatusData& q_status = m_QuestStatus[questid];
2185
2186 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2187 {
2188 if (int32(count) >= -rewOrReqMoney)
2189 {
2190 if (CanCompleteQuest(questid))
2191 {
2192 CompleteQuest(questid);
2193 }
2194 }
2195 }
2196 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2197 {
2198 if (int32(count) < -rewOrReqMoney)
2199 {
2200 IncompleteQuest(questid);
2201 }
2202 }
2203 }
2204 }
2205 }
2206}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by SetMoney().

◆ MoveItemFromInventory()

void Player::MoveItemFromInventory ( uint8  bag,
uint8  slot,
bool  update 
)
2979{
2980 if (Item* it = GetItemByPos(bag, slot))
2981 {
2982 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
2983 RemoveItem(bag, slot, update);
2985 it->SetNotRefundable(this, false);
2986 it->RemoveFromUpdateQueueOf(this);
2987 if (it->IsInWorld())
2988 {
2989 it->RemoveFromWorld();
2990 it->DestroyForPlayer(this);
2991 }
2992
2993 sScriptMgr->OnAfterPlayerMoveItemFromInventory(this, it, bag, slot, update);
2994 }
2995}

References GetItemByPos(), ItemRemovedQuestCheck(), RemoveItem(), sScriptMgr, and UpdateTitansGrip().

Referenced by AutoUnequipOffhandIfNeed(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionSellItem(), and WorldSession::HandleSendMail().

◆ MoveItemToInventory()

void Player::MoveItemToInventory ( ItemPosCountVec const &  dest,
Item pItem,
bool  update,
bool  in_characterInventoryDB = false 
)
2999{
3000 // update quest counters
3001 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3003
3004 // store item
3005 Item* pLastItem = StoreItem(dest, pItem, update);
3006
3007 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3008 if (pLastItem == pItem)
3009 {
3010 // update owner for last item (this can be original item with wrong owner
3011 if (pLastItem->GetOwnerGUID() != GetGUID())
3012 pLastItem->SetOwnerGUID(GetGUID());
3013
3014 // if this original item then it need create record in inventory
3015 // in case trade we already have item in other player inventory
3016 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3017
3018 if (pLastItem->IsBOPTradable())
3019 AddTradeableItem(pLastItem);
3020 }
3021}
ObjectGuid GetOwnerGUID() const
Definition Item.h:231

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Item::IsBOPTradable(), ITEM_CHANGED, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2953{ return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end

References m_bMustDelayTeleport.

Referenced by TeleportTo().

◆ NeedSendSpectatorData()

bool Player::NeedSendSpectatorData ( ) const
15438{
15439 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15440 {
15441 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15442 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15443 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15444 return true;
15445 }
15446 return false;
15447}
Definition Map.h:851
bool HaveSpectators()
Definition Battleground.h:407
BattlegroundPlayerMap const & GetPlayers() const
Definition Battleground.h:418
bool IsSpectator() const
Definition Player.h:2584

References WorldObject::FindMap(), Object::GetGUID(), Battleground::GetPlayers(), Battleground::GetStatus(), Battleground::HaveSpectators(), IsSpectator(), and STATUS_IN_PROGRESS.

Referenced by _AddSpellCooldown(), Spell::cancel(), RemovePet(), Spell::SendChannelStart(), SendClearCooldown(), Spell::SendSpellStart(), setDeathState(), Unit::SetHealth(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), SetSelection(), and SummonPet().

◆ NeedToSaveGlyphs()

bool Player::NeedToSaveGlyphs ( )
inline
2609{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5239{
5240 uint8 level = GetLevel();
5241 uint32 pclass = getClass();
5242
5243 if (level > GT_MAX_LEVEL)
5244 level = GT_MAX_LEVEL;
5245
5246 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5247 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5248 if (!baseRatio || !moreRatio)
5249 return 0.0f;
5250
5251 // Formula from PaperDollFrame script
5252 float spirit = GetStat(STAT_SPIRIT);
5253 float baseSpirit = spirit;
5254 if (baseSpirit > 50)
5255 baseSpirit = 50;
5256 float moreSpirit = spirit - baseSpirit;
5257 float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2;
5258 return regen;
5259}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition DBCStructure.h:1081
float ratio
Definition DBCStructure.h:1082
Definition DBCStructure.h:1091
float ratio
Definition DBCStructure.h:1092

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtOCTRegenHPEntry::ratio, GtRegenHPPerSptEntry::ratio, sGtOCTRegenHPStore, sGtRegenHPPerSptStore, and STAT_SPIRIT.

Referenced by RegenerateHealth().

◆ OCTRegenMPPerSpirit()

float Player::OCTRegenMPPerSpirit ( )
5262{
5263 uint8 level = GetLevel();
5264 uint32 pclass = getClass();
5265
5266 if (level > GT_MAX_LEVEL)
5267 level = GT_MAX_LEVEL;
5268
5269 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5270 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5271 if (!moreRatio)
5272 return 0.0f;
5273
5274 // Formula get from PaperDollFrame script
5275 float spirit = GetStat(STAT_SPIRIT);
5276 float regen = spirit * moreRatio->ratio;
5277 return regen;
5278}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition DBCStructure.h:1096
float ratio
Definition DBCStructure.h:1097

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtRegenMPPerSptEntry::ratio, sGtRegenMPPerSptStore, and STAT_SPIRIT.

Referenced by UpdateManaRegen().

◆ OfflineResurrect()

◆ OnGossipSelect()

void Player::OnGossipSelect ( WorldObject source,
uint32  gossipListId,
uint32  menuId 
)
245{
247
248 // if not same, then something funky is going on
249 if (menuId != gossipMenu.GetMenuId())
250 return;
251
252 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
253 if (!item)
254 return;
255
256 uint32 gossipOptionId = item->OptionType;
257 ObjectGuid guid = source->GetGUID();
258
259 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature())
260 {
262 {
264
267 else
269
271 return;
272 }
273 }
274
275 if (source->IsGameObject())
276 {
277 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
278 {
279 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
280 return;
281 }
282 }
283
284 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
285 if (!menuItemData)
286 return;
287
288 int32 cost = int32(item->BoxMoney);
289 if (!HasEnoughMoney(cost))
290 {
293 return;
294 }
295
296 switch (gossipOptionId)
297 {
300 {
301 if (menuItemData->GossipActionPoi)
303
304 if (menuItemData->GossipActionMenuId)
305 {
306 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
307 SendPreparedGossip(source);
308 }
309
310 break;
311 }
313 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
314 break;
316 if (isDead())
317 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
318 break;
320 PrepareQuestMenu(guid);
321 SendPreparedQuest(guid);
322 break;
325 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
326 break;
328 GetSession()->SendStablePet(guid);
329 break;
332 break;
334 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
335 {
336 // Cast spells that teach dual spec
337 // Both are also ImplicitTarget self and must be cast by player
338 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
339 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
340
341 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
342 SendPreparedGossip(source);
343 }
344 break;
348 break;
352 break;
354 GetSession()->SendTaxiMenu(source->ToCreature());
355 break;
358 SetBindPoint(guid);
359 break;
361 GetSession()->SendShowBank(guid);
362 break;
366 break;
370 break;
372 GetSession()->SendAuctionHello(guid, source->ToCreature());
373 break;
375 PrepareGossipMenu(source);
376 SendPreparedGossip(source);
377 break;
379 {
380 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
381
382 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
383 {
384 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
385 return;
386 }
387
388 GetSession()->SendBattleGroundList(guid, bgTypeId);
389 break;
390 }
391 }
392
393 ModifyMoney(-cost);
394}
@ GOSSIP_OPTION_AUCTIONEER
Definition GossipDef.h:48
@ GOSSIP_OPTION_UNLEARNTALENTS
Definition GossipDef.h:51
@ GOSSIP_OPTION_TRAINER
Definition GossipDef.h:40
@ GOSSIP_OPTION_ARMORER
Definition GossipDef.h:50
@ GOSSIP_OPTION_UNLEARNPETTALENTS
Definition GossipDef.h:52
@ GOSSIP_OPTION_VENDOR
Definition GossipDef.h:38
@ GOSSIP_OPTION_OUTDOORPVP
Definition GossipDef.h:54
@ GOSSIP_OPTION_BATTLEFIELD
Definition GossipDef.h:47
@ GOSSIP_OPTION_TABARDDESIGNER
Definition GossipDef.h:46
@ GOSSIP_OPTION_TAXIVENDOR
Definition GossipDef.h:39
@ GOSSIP_OPTION_QUESTGIVER
Definition GossipDef.h:37
@ GOSSIP_OPTION_LEARNDUALSPEC
Definition GossipDef.h:53
@ GOSSIP_OPTION_INNKEEPER
Definition GossipDef.h:43
@ GOSSIP_OPTION_SPIRITGUIDE
Definition GossipDef.h:42
@ GOSSIP_OPTION_DUALSPEC_INFO
Definition GossipDef.h:55
@ GOSSIP_OPTION_PETITIONER
Definition GossipDef.h:45
@ GOSSIP_OPTION_BANKER
Definition GossipDef.h:44
@ GOSSIP_OPTION_GOSSIP
Definition GossipDef.h:36
@ GOSSIP_OPTION_SPIRITHEALER
Definition GossipDef.h:41
@ GOSSIP_OPTION_STABLEPET
Definition GossipDef.h:49
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition IWorld.h:237
@ LANG_INSTANT_FLIGHT_OFF
Definition Language.h:1319
@ LANG_INSTANT_FLIGHT_ON
Definition Language.h:1318
@ GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT
Definition Player.h:1023
BattlegroundTypeId
Definition SharedDefines.h:3479
@ BATTLEGROUND_TYPE_NONE
Definition SharedDefines.h:3480
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition UnitDefines.h:328
void SendNotification(std::string_view str)
Definition Chat.cpp:104
Definition GossipDef.h:163
GossipMenuItem const * GetItem(uint32 id) const
Definition GossipDef.h:188
uint32 GetMenuId() const
Definition GossipDef.h:172
GossipMenuItemData const * GetItemData(uint32 indexId) const
Definition GossipDef.h:197
bool IsGameObject() const
Definition Object.h:212
Unit * ToUnit()
Definition Object.h:209
void SendCloseGossip()
Definition GossipDef.cpp:239
void SendPointOfInterest(uint32 poiId) const
Definition GossipDef.cpp:247
GossipMenu & GetGossipMenu()
Definition GossipDef.h:264
void SendTalentWipeConfirm(ObjectGuid guid)
Definition Player.cpp:8916
void SendPreparedGossip(WorldObject *source)
Definition PlayerGossip.cpp:209
void SendPreparedQuest(ObjectGuid guid)
Definition PlayerQuest.cpp:115
void ToggleInstantFlight()
Definition PlayerGossip.cpp:437
void ResetPetTalents()
Definition Player.cpp:8925
void PrepareQuestMenu(ObjectGuid guid)
Definition PlayerQuest.cpp:39
void SetBindPoint(ObjectGuid guid)
Definition Player.cpp:8909
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition PlayerGossip.cpp:32
NPCFlags GetNpcFlags() const
Clears emote state (looping emote)
Definition Unit.h:733
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition AuctionHouseHandler.cpp:53
void SendPetitionShowList(ObjectGuid guid)
Definition PetitionsHandler.cpp:824
void SendTaxiMenu(Creature *unit)
Definition TaxiHandler.cpp:84
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition ItemHandler.cpp:1035
void SendTrainerList(ObjectGuid guid)
Definition NPCHandler.cpp:87
void SendShowBank(ObjectGuid guid)
Definition BankHandler.cpp:188
void SendStablePet(ObjectGuid guid)
Definition NPCHandler.cpp:480
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition BattleGroundHandler.cpp:65
void SendTabardVendorActivate(ObjectGuid guid)
Definition NPCHandler.cpp:65
Definition GossipDef.h:146
uint32 GossipActionMenuId
Definition GossipDef.h:147
uint32 GossipActionPoi
Definition GossipDef.h:148
Definition GossipDef.h:132
uint32 OptionType
Definition GossipDef.h:137
uint32 BoxMoney
Definition GossipDef.h:139

References BATTLEGROUND_TYPE_NONE, GossipMenuItem::BoxMoney, BUY_ERR_NOT_ENOUGHT_MONEY, Unit::CastSpell(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, Object::GetEntry(), PlayerMenu::GetGossipMenu(), Object::GetGUID(), Object::GetGUID(), GossipMenu::GetItem(), GossipMenu::GetItemData(), Unit::GetLevel(), GossipMenu::GetMenuId(), Unit::GetNpcFlags(), GetSession(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, GossipMenuItemData::GossipActionMenuId, GossipMenuItemData::GossipActionPoi, HasEnoughMoney(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_INSTANT_FLIGHT_OFF, LANG_INSTANT_FLIGHT_ON, LOG_ERROR, m_isInstantFlightOn, ModifyMoney(), GossipMenuItem::OptionType, PlayerTalkClass, PrepareGossipMenu(), PrepareQuestMenu(), ResetPetTalents(), sBattlegroundMgr, WorldSession::SendAuctionHello(), WorldSession::SendBattleGroundList(), SendBuyError(), PlayerMenu::SendCloseGossip(), WorldSession::SendListInventory(), ChatHandler::SendNotification(), WorldSession::SendPetitionShowList(), PlayerMenu::SendPointOfInterest(), SendPreparedGossip(), SendPreparedQuest(), WorldSession::SendShowBank(), WorldSession::SendStablePet(), WorldSession::SendTabardVendorActivate(), SendTalentWipeConfirm(), WorldSession::SendTaxiMenu(), WorldSession::SendTrainerList(), SetBindPoint(), sOutdoorPvPMgr, sWorld, Object::ToCreature(), ToggleInstantFlight(), Position::ToString(), Object::ToUnit(), and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7783{
7784 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7785 return;
7786
7787 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7788 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7789 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7790 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7791 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7792 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7793 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7794 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7795 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7796 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7797 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7798 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7799}
@ LOG_LEVEL_DEBUG
Definition LogCommon.h:31
#define sLog
Definition Log.h:126
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:285
uint32 GetArmor() const
Definition Unit.h:1088

References BASE_ATTACK, Unit::GetArmor(), Unit::GetAttackTime(), Object::GetFloatValue(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), LOG_DEBUG, LOG_LEVEL_DEBUG, PLAYER_BLOCK_PERCENTAGE, POWER_MANA, RANGED_ATTACK, sLog, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_SHADOW, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by LoadFromDB(), and SaveToDB().

◆ PetSpellInitialize()

void Player::PetSpellInitialize ( )
9506{
9507 Pet* pet = GetPet();
9508
9509 if (!pet)
9510 return;
9511
9512 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9513
9514 CharmInfo* charmInfo = pet->GetCharmInfo();
9515
9516 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9517 data << pet->GetGUID();
9518 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9519 data << uint32(pet->GetDuration().count());
9520 data << uint8(pet->GetReactState());
9521 data << uint8(charmInfo->GetCommandState());
9522 data << uint16(0); // Flags, mostly unknown
9523
9524 // action bar loop
9525 charmInfo->BuildActionBar(&data);
9526
9527 std::size_t spellsCountPos = data.wpos();
9528
9529 // spells count
9530 uint8 addlist = 0;
9531 data << uint8(addlist); // placeholder
9532
9533 if (pet->IsPermanentPetFor(this))
9534 {
9535 // spells loop
9536 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9537 {
9538 if (itr->second.state == PETSPELL_REMOVED)
9539 continue;
9540
9541 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9542 ++addlist;
9543 }
9544 }
9545
9546 data.put<uint8>(spellsCountPos, addlist);
9547
9548 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9549 data << uint8(cooldownsCount);
9550
9551 uint32 curTime = GameTime::GetGameTimeMS().count();
9553
9554 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9555 {
9556 uint16 category = itr->second.category;
9557 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9558
9559 data << uint32(itr->first); // spellid
9560 data << uint16(itr->second.category); // spell category
9561
9562 // send infinity cooldown in special format
9563 if (itr->second.end >= infTime)
9564 {
9565 data << uint32(1); // cooldown
9566 data << uint32(0x80000000); // category cooldown
9567 continue;
9568 }
9569
9570 data << uint32(category ? 0 : cooldown); // cooldown
9571 data << uint32(category ? cooldown : 0); // category cooldown
9572 }
9573
9574 GetSession()->SendPacket(&data);
9575}
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition CharmInfo.h:33
@ PETSPELL_REMOVED
Definition PetDefines.h:60
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition Creature.h:254
bool IsPermanentPetFor(Player *owner) const
Definition Pet.cpp:2292
Milliseconds GetDuration() const
Definition Pet.h:91
PetSpellMap m_spells
Definition Pet.h:121

References CharmInfo::BuildActionBar(), CreatureTemplate::family, Unit::GetCharmInfo(), CharmInfo::GetCommandState(), Creature::GetCreatureTemplate(), Pet::GetDuration(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetPet(), Creature::GetReactState(), GetSession(), infinityCooldownDelayCheck, Pet::IsPermanentPetFor(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Pet::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_UNIT_ACTION_BAR_INDEX, PETSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_PET_SPELLS, and ByteBuffer::wpos().

Referenced by CreatePet(), CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectLearnPetSpell(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), AuraEffect::HandleModPossessPet(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleRequestPetInfo(), Pet::learnSpell(), Pet::LoadPetFromDB(), Pet::resetTalents(), Unit::SetMinion(), and SummonPet().

◆ PossessSpellInitialize()

void Player::PossessSpellInitialize ( )
9578{
9579 Unit* charm = GetCharm();
9580 if (!charm)
9581 return;
9582
9583 CharmInfo* charmInfo = charm->GetCharmInfo();
9584
9585 if (!charmInfo)
9586 {
9587 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9588 return;
9589 }
9590
9591 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9592 data << charm->GetGUID();
9593 data << uint16(0);
9594 data << uint32(0);
9595 data << uint32(0);
9596
9597 charmInfo->BuildActionBar(&data);
9598
9599 data << uint8(0); // spells count
9600 data << uint8(0); // cooldowns count
9601
9602 GetSession()->SendPacket(&data);
9603}
Unit * GetCharm() const
Definition Unit.cpp:10730

References CharmInfo::BuildActionBar(), Unit::GetCharm(), Unit::GetCharmInfo(), Object::GetGUID(), GetSession(), LOG_ERROR, MAX_UNIT_ACTION_BAR_INDEX, WorldSession::SendPacket(), SMSG_PET_SPELLS, and ObjectGuid::ToString().

Referenced by Unit::SetCharmedBy().

◆ PrepareCharmAISpells()

void Player::PrepareCharmAISpells ( )
15450{
15451 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15452 m_charmAISpells[i] = 0;
15453
15454 uint32 damage_type[4] = {0, 0, 0, 0};
15455 uint32 periodic_damage = 0;
15456
15457 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15458 {
15459 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15460 continue;
15461
15462 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15463 if (!spellInfo)
15464 continue;
15465
15466 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15467 continue;
15468
15469 float cast = spellInfo->CalcCastTime() / 1000.0f;
15470 if (cast > 3.0f)
15471 continue;
15472
15473 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15474 {
15475 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15476 {
15477 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15478 uint8 offset = 0;
15479 if (cast)
15480 {
15481 dmg = dmg / cast;
15482 offset = 2;
15483 }
15484
15485 if ((int32)damage_type[offset] < dmg)
15486 {
15487 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15488 if (damage_type[1 + offset] < damage_type[offset])
15489 {
15491 damage_type[1 + offset] = damage_type[offset];
15492 }
15493
15494 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15495 damage_type[offset] = dmg;
15496 }
15497 else if ((int32)damage_type[1 + offset] < dmg)
15498 {
15499 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15500 continue;
15501
15502 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15503 damage_type[1 + offset] = dmg;
15504 }
15505 break;
15506 }
15508 {
15509 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15510 break;
15511 }
15512 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15513 {
15514 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15515 break;
15516 }
15517 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15518 {
15519 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15520 break;
15521 }
15522 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15523 {
15524 if ((int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i))
15525 {
15526 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15527 break;
15528 }
15529 }
15530 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15531 {
15532 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15533 break;
15534 }
15535 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15536 {
15538 break;
15539 }
15540 }
15541 }
15542}
@ SPELL_ROOT_OR_FEAR
Definition Player.h:921
@ SPELL_INSTANT_DAMAGE2
Definition Player.h:923
@ SPELL_INSTANT_DAMAGE
Definition Player.h:922
@ SPELL_T_CHARGE
Definition Player.h:927
@ SPELL_DOT_DAMAGE
Definition Player.h:926
@ SPELL_FAST_RUN
Definition Player.h:929
@ SPELL_T_STUN
Definition Player.h:920
@ SPELL_IMMUNITY
Definition Player.h:928
@ SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition SharedDefines.h:659
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:780
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition SpellInfo.cpp:2581
bool NeedsComboPoints() const
Definition SpellInfo.cpp:1266
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2352
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14917

References SpellInfo::CalcCastTime(), Unit::CalculateSpellDamage(), SpellInfo::Effects, GetActiveSpec(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsHighRankOf(), SpellInfo::IsPassive(), m_charmAISpells, m_spells, MAX_SPELL_EFFECTS, SpellInfo::NeedsComboPoints(), NUM_CAI_SPELLS, PLAYERSPELL_REMOVED, SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_DOT_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_FAST_RUN, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_INSTANT_DAMAGE2, SPELL_ROOT_OR_FEAR, SPELL_T_CHARGE, SPELL_T_STUN, SpellInfo::SpellFamilyName, sSpellMgr, SpellInfo::Stances, and urand().

Referenced by LoadFromDB().

◆ PrepareGossipMenu()

void Player::PrepareGossipMenu ( WorldObject source,
uint32  menuId = 0,
bool  showQuests = false 
)

Find localizations from database.

Find localizations from database.

33{
35 menu->ClearMenus();
36
37 menu->GetGossipMenu().SetMenuId(menuId);
38
39 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
40
41 // if default menuId and no menu options exist for this, use options from default options
42 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
43 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
44
45 uint32 npcflags = 0;
46
47 if (source->IsCreature())
48 {
49 npcflags = source->ToUnit()->GetNpcFlags();
50 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
51 PrepareQuestMenu(source->GetGUID());
52 }
53 else if (source->IsGameObject())
54 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
55 PrepareQuestMenu(source->GetGUID());
56
57 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
58 {
59 bool canTalk = true;
60 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
61 continue;
62
63 if (Creature* creature = source->ToCreature())
64 {
65 if (!(itr->second.OptionNpcFlag & npcflags))
66 continue;
67
68 switch (itr->second.OptionType)
69 {
71 canTalk = false; // added in special mode
72 break;
74 if (!isDead())
75 canTalk = false;
76 break;
78 {
79 if (!creature->isVendorWithIconSpeak())
80 {
81 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
82 if (!vendorItems || vendorItems->Empty())
83 {
84 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
85 canTalk = false;
86 }
87 break;
88 }
89 break;
90 }
93 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
94 canTalk = false;
95 break;
97 if (!creature->isCanTrainingAndResetTalentsOf(this))
98 canTalk = false;
99 break;
101 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
102 canTalk = false;
103 break;
105 if (GetSession()->SendLearnNewTaxiNode(creature))
106 return;
107 break;
109 if (!creature->isCanInteractWithBattleMaster(this, false))
110 canTalk = false;
111 break;
114 canTalk = false;
115 break;
117 canTalk = false;
118 break;
120 if (!creature->IsValidTrainerForPlayer(this))
121 {
122 canTalk = false;
123 }
124 break;
126 if (creature->isVendorWithIconSpeak())
127 {
128 VendorItemData const* vendorItems = creature->GetVendorItems();
129 if (!vendorItems || vendorItems->Empty())
130 {
131 canTalk = false;
132 }
133 }
134 break;
141 break; // no checks
143 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
144 canTalk = false;
145 break;
146 default:
147 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
148 canTalk = false;
149 break;
150 }
151 }
152 else if (GameObject* go = source->ToGameObject())
153 {
154 switch (itr->second.OptionType)
155 {
157 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
158 canTalk = false;
159 break;
160 default:
161 canTalk = false;
162 break;
163 }
164 }
165
166 if (canTalk)
167 {
168 // using gossip_menu_option texts by default
169 std::string strOptionText = itr->second.OptionText;
170 std::string strBoxText = itr->second.BoxText;
171 // search in broadcast_text and broadcast_text_locale
172 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
173 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
175
176 if (optionBroadcastText)
177 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
178
179 if (boxBroadcastText)
180 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
181
182 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
183 if (locale != DEFAULT_LOCALE)
184 {
185 if (!optionBroadcastText)
186 {
188 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
189 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
190 }
191
192 if (!boxBroadcastText)
193 {
195 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
196 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
197 }
198 }
199
200 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
201 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
202 }
203 }
204
205 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
207}
LocaleConstant
Definition Common.h:65
#define DEFAULT_LOCALE
Definition Common.h:79
@ GOSSIP_ICON_INTERACT_1
Definition GossipDef.h:65
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition Language.h:1317
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition ObjectMgr.h:634
@ HUNTER_PET
Definition PetDefines.h:32
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1570
@ TRAINER_TYPE_PETS
Definition SharedDefines.h:2620
GameobjectTypes GetGoType() const
Definition GameObject.h:202
void SetMenuId(uint32 menu_id)
Definition GossipDef.h:171
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition GossipDef.cpp:41
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition GossipDef.cpp:136
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition ObjectMgr.h:1413
void ClearMenus()
Definition GossipDef.cpp:187
AC_GAME_API std::string GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition ChatCommandHelpers.cpp:27
Definition ObjectMgr.h:434
std::vector< std::string > MaleText
Definition ObjectMgr.h:443
Definition CreatureData.h:349

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), CLASS_CONTEXT_PET, CLASS_HUNTER, PlayerMenu::ClearMenus(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, DEFAULT_LOCALE, VendorItemData::Empty(), BroadcastText::FemaleText, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GENDER_MALE, WorldSession::GetAcoreString(), Creature::GetCreatureTemplate(), GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_ICON_INTERACT_1, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, HUNTER_PET, IsClass(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_TOGGLE_INSTANT_FLIGHT, LOG_ERROR, m_spells, MAKE_PAIR32(), BroadcastText::MaleText, PlayerTalkClass, PrepareQuestMenu(), sConditionMgr, GossipMenu::SetMenuId(), sObjectMgr, sOutdoorPvPMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), Object::ToUnit(), CreatureTemplate::trainer_type, TRAINER_TYPE_PETS, UNIT_NPC_FLAG_FLIGHTMASTER, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), brann_bronzebeard::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ PrepareQuestMenu()

void Player::PrepareQuestMenu ( ObjectGuid  guid)
40{
41 QuestRelationBounds objectQR;
42 QuestRelationBounds objectQIR;
43
44 // pets also can have quests
46 if (creature)
47 {
48 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
49 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
50 }
51 else
52 {
53 //we should obtain map pointer from GetMap() in 99% of cases. Special case
54 //only for quests which cast teleport spells on player
56 ASSERT(_map);
57 GameObject* pGameObject = _map->GetGameObject(guid);
58 if (pGameObject)
59 {
60 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
61 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
62 }
63 else
64 return;
65 }
66
68 qm.ClearMenu();
69
70 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
71 {
72 uint32 quest_id = i->second;
73 QuestStatus status = GetQuestStatus(quest_id);
74 if (status == QUEST_STATUS_COMPLETE)
75 qm.AddMenuItem(quest_id, 4);
76 else if (status == QUEST_STATUS_INCOMPLETE)
77 qm.AddMenuItem(quest_id, 4);
78 //else if (status == QUEST_STATUS_AVAILABLE)
79 // qm.AddMenuItem(quest_id, 2);
80 }
81
82 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
83 {
84 uint32 quest_id = i->second;
85 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
86 if (!quest)
87 continue;
88
89 if (!CanTakeQuest(quest, false))
90 continue;
91
92 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
93 qm.AddMenuItem(quest_id, 0);
94 else if (quest->IsAutoComplete())
95 qm.AddMenuItem(quest_id, 4);
96 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
97 qm.AddMenuItem(quest_id, 2);
98 }
99}
QuestMenu & GetQuestMenu()
Definition GossipDef.h:265
Definition GossipDef.h:229
void ClearMenu()
Definition GossipDef.cpp:310
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition GossipDef.cpp:286

References QuestMenu::AddMenuItem(), ASSERT, CanTakeQuest(), QuestMenu::ClearMenu(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), PlayerMenu::GetQuestMenu(), GetQuestStatus(), Quest::IsAutoComplete(), Quest::IsDaily(), Object::IsInWorld(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), PlayerTalkClass, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, sMapMgr, and sObjectMgr.

Referenced by npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), npc_sayge::OnGossipHello(), go_fel_crystalforge::OnGossipHello(), go_bashir_crystalforge::OnGossipHello(), OnGossipSelect(), PrepareGossipMenu(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ PrettyPrintRequirementsAchievementsList()

void Player::PrettyPrintRequirementsAchievementsList ( const std::vector< const ProgressionRequirement * > &  missingAchievements) const
6636{
6638 for (const ProgressionRequirement* missingReq : missingAchievements)
6639 {
6640 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6641 if (!achievementEntry)
6642 {
6643 continue;
6644 }
6645
6646 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6647
6648 std::stringstream stream;
6649 stream << "|cffff7c0a|Hachievement:";
6650 stream << missingReq->id;
6651 stream << ":";
6652 stream << GetGUID().ToString();
6653 stream << ":0:0:0:0:0:0:0:0|h[";
6654 stream << name;
6655 stream << "]|h|r";
6656
6657 if (missingReq->note.empty())
6658 {
6659 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6660 }
6661 else
6662 {
6663 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6664 }
6665 }
6666}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition Language.h:846
Definition DBCStructure.h:39
std::array< char const *, 16 > name
Definition DBCStructure.h:44
Definition Player.h:938

References Object::GetGUID(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), LANG_ACCESS_REQUIREMENT_NOTE, AchievementEntry::name, ChatHandler::PSendSysMessage(), sAchievementStore, sObjectMgr, and ObjectGuid::ToString().

Referenced by Satisfy().

◆ PrettyPrintRequirementsItemsList()

void Player::PrettyPrintRequirementsItemsList ( const std::vector< const ProgressionRequirement * > &  missingItems) const
6669{
6671 for (const ProgressionRequirement* missingReq : missingItems)
6672 {
6673 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6674 if (!itemTemplate)
6675 {
6676 continue;
6677 }
6678
6679 //Get the localised name
6680 std::string name = itemTemplate->Name1;
6681 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6682 {
6683 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6684 }
6685
6686 std::stringstream stream;
6687 stream << "|c";
6688 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6689 stream << "|Hitem:";
6690 stream << itemTemplate->ItemId;
6691 stream << ":0:0:0:0:0:0:0:0:0|h[";
6692 stream << name;
6693 stream << "]|h|r";
6694
6695 if (missingReq->note.empty())
6696 {
6697 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6698 }
6699 else
6700 {
6701 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6702 }
6703 }
6704}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition SharedDefines.h:353
Definition ItemTemplate.h:838
std::string Name1
Definition ItemTemplate.h:624

References ObjectMgr::GetLocaleString(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), ItemTemplate::ItemId, ItemQualityColors, LANG_ACCESS_REQUIREMENT_NOTE, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemTemplate::Quality, and sObjectMgr.

Referenced by Satisfy().

◆ PrettyPrintRequirementsQuestList()

void Player::PrettyPrintRequirementsQuestList ( const std::vector< const ProgressionRequirement * > &  missingQuests) const
6599{
6601 for (const ProgressionRequirement* missingReq : missingQuests)
6602 {
6603 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6604 if (!questTemplate)
6605 {
6606 continue;
6607 }
6608
6609 std::string questTitle = questTemplate->GetTitle();
6610 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6611 {
6612 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6613 }
6614
6615 std::stringstream stream;
6616 stream << "|cffff7c0a|Hquest:";
6617 stream << questTemplate->GetQuestId();
6618 stream << ":";
6619 stream << questTemplate->GetQuestLevel();
6620 stream << "|h[";
6621 stream << questTitle;
6622 stream << "]|h|r";
6623
6624 if (missingReq->note.empty())
6625 {
6626 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6627 }
6628 else
6629 {
6630 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6631 }
6632 }
6633}
int32 GetQuestLevel() const
Definition QuestDef.h:233
std::string const & GetTitle() const
Definition QuestDef.h:261
Definition QuestDef.h:183

References ObjectMgr::GetLocaleString(), Quest::GetQuestId(), Quest::GetQuestLevel(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LANG_ACCESS_REQUIREMENT_NOTE, ChatHandler::PSendSysMessage(), and sObjectMgr.

Referenced by Satisfy().

◆ ProcessDelayedOperations()

void Player::ProcessDelayedOperations ( )
1619{
1620 if (m_DelayedOperations == 0)
1621 return;
1622
1624 {
1625 ResurrectPlayer(0.0f, false);
1626
1629 else
1630 SetFullHealth();
1631
1634 else
1636
1637 SetPower(POWER_RAGE, 0);
1639
1641 }
1642
1644 SaveToDB(false, false);
1645
1647 {
1648 Aura* aura = GetAura(26013);
1649 if (!aura || aura->GetDuration() <= 900000)
1650 CastSpell(this, 26013, true);
1651 }
1652
1654 {
1656 {
1657 // xinef: remove shapeshift auras
1659 {
1661 }
1664 }
1665 }
1666
1668 {
1670 {
1675 }
1676 }
1677
1679 {
1680 if (Group* g = GetGroup())
1681 g->SendUpdateToPlayer(GetGUID());
1682 }
1683
1685 {
1686 if (Vehicle* vehicle = GetVehicle())
1687 {
1688 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1689 if (itr != vehicle->Seats.end())
1690 if (Unit* base = vehicle->GetBase())
1691 {
1692 ExitVehicle();
1693 base->HandleSpellClick(this, itr->first);
1694 }
1695 }
1696 }
1697
1698 //we have executed ALL delayed ops, so clear the flag
1700}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition Player.h:913
@ DELAYED_SAVE_PLAYER
Definition Player.h:908
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition Player.h:911
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:914
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition Player.h:912
@ DELAYED_SPELL_CAST_DESERTER
Definition Player.h:910
@ DELAYED_RESURRECT_PLAYER
Definition Player.h:909
void SaveToDB(bool create, bool logout)
Definition PlayerStorage.cpp:7050
uint32 m_resurrectMana
Definition Player.h:2852
void ContinueTaxiFlight()
Definition Player.cpp:10481
uint32 m_resurrectHealth
Definition Player.h:2852
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18929
Definition Vehicle.h:28

References Unit::AddAura(), PlayerTaxi::AddTaxiDestination(), Unit::CastSpell(), EntryPointData::ClearTaxiPath(), ContinueTaxiFlight(), DELAYED_BG_GROUP_RESTORE, DELAYED_BG_MOUNT_RESTORE, DELAYED_BG_TAXI_RESTORE, DELAYED_RESURRECT_PLAYER, DELAYED_SAVE_PLAYER, DELAYED_SPELL_CAST_DESERTER, DELAYED_VEHICLE_TELEPORT, Unit::ExitVehicle(), Unit::GetAura(), Aura::GetDuration(), GetGroup(), Object::GetGUID(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetVehicle(), EntryPointData::HasTaxiPath(), Unit::IsInDisallowedMountForm(), m_DelayedOperations, m_entryPointData, m_resurrectHealth, m_resurrectMana, m_taxi, EntryPointData::mountSpell, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasByType(), ResurrectPlayer(), SaveToDB(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), SPELL_AURA_MOD_SHAPESHIFT, and EntryPointData::taxiPath.

Referenced by WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ProcessSpellQueue()

void Player::ProcessSpellQueue ( )
protected
2369{
2370 while (!SpellQueue.empty())
2371 {
2372 PendingSpellCastRequest& request = SpellQueue.front(); // Peek at the first spell
2373 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(request.spellId);
2374 if (!spellInfo)
2375 {
2376 LOG_ERROR("entities.player", "Player::ProcessSpellQueue: Invalid spell {}", request.spellId);
2377 SpellQueue.clear();
2378 break;
2379 }
2380 if (CanExecutePendingSpellCastRequest(spellInfo))
2381 {
2383 SpellQueue.pop_front(); // Remove from the queue
2384 }
2385 else // If the first spell can't execute, stop processing
2386 break;
2387 }
2388}
bool CanExecutePendingSpellCastRequest(SpellInfo const *spellInfo)
Definition PlayerUpdates.cpp:2303
void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest *castRequest, bool isCancel=false)
Definition PlayerUpdates.cpp:2354
uint32 spellId
Definition Player.h:1070

References CanExecutePendingSpellCastRequest(), ExecuteOrCancelSpellCastRequest(), LOG_ERROR, PendingSpellCastRequest::spellId, SpellQueue, and sSpellMgr.

Referenced by Update().

◆ ProcessTerrainStatusUpdate()

void Player::ProcessTerrainStatusUpdate ( )
overridevirtual

Reimplemented from Unit.

2244{
2245 // process liquid auras using generic unit code
2247
2248 LiquidData const& liquidData = GetLiquidData();
2249
2250 // player specific logic for mirror timers
2251 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2252 {
2253 // Breath bar state (under water in any liquid type)
2254 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2255 {
2256 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2258 else
2259 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2260 }
2261
2262 // Fatigue bar state (if not on flight path or transport)
2263 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2264 {
2265 // Exclude also uncontrollable vehicles
2266 Vehicle* vehicle = GetVehicle();
2267 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2268 if (!vehicleSeat || vehicleSeat->CanControl())
2270 else
2271 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2272 }
2273 else
2274 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2275
2276 // Lava state (any contact)
2277 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2278 {
2279 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2281 else
2282 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2283 }
2284
2285 // Slime state (any contact)
2286 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2287 {
2288 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2290 else
2291 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2292 }
2293 }
2294 else
2296}
#define MAP_LIQUID_TYPE_MAGMA
Definition Map.h:155
@ LIQUID_MAP_UNDER_WATER
Definition Map.h:146
@ LIQUID_MAP_NO_WATER
Definition Map.h:142
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition Map.h:150
#define MAP_LIQUID_TYPE_DARK_WATER
Definition Map.h:160
#define MAP_LIQUID_TYPE_SLIME
Definition Map.h:156
#define MAP_ALL_LIQUIDS
Definition Map.h:158
@ UNDERWATER_INSLIME
Definition Player.h:103
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4293
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition Vehicle.cpp:597
LiquidData const & GetLiquidData() const
Definition Object.cpp:3192
Definition Map.h:169
uint32 Flags
Definition Map.h:173
LiquidStatus Status
Definition Map.h:176
Definition DBCStructure.h:2063
bool CanControl() const
Definition DBCStructure.h:2126

References VehicleSeatEntry::CanControl(), LiquidData::Flags, WorldObject::GetLiquidData(), Vehicle::GetSeatForPassenger(), WorldObject::GetTransport(), Unit::GetVehicle(), Unit::IsInFlight(), LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, m_MirrorTimerFlags, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_IN_CONTACT, MAP_LIQUID_TYPE_DARK_WATER, MAP_LIQUID_TYPE_MAGMA, MAP_LIQUID_TYPE_SLIME, Unit::ProcessTerrainStatusUpdate(), LiquidData::Status, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INSLIME, and UNDERWATER_INWATER.

◆ ProhibitSpellSchool()

void Player::ProhibitSpellSchool ( SpellSchoolMask  idSchoolMask,
uint32  unTimeMs 
)
overridevirtual

Reimplemented from Unit.

10577{
10578 PacketCooldowns cooldowns;
10579 WorldPacket data;
10580
10581 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10582 {
10583 if (itr->second->State == PLAYERSPELL_REMOVED)
10584 continue;
10585 uint32 unSpellId = itr->first;
10586 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10587
10588 // Not send cooldown for this spells
10589 if (spellInfo->IsCooldownStartedOnEvent())
10590 continue;
10591
10593 continue;
10594
10595 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10596 {
10597 cooldowns[unSpellId] = unTimeMs;
10598 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10599 }
10600 }
10601
10602 if (!cooldowns.empty())
10603 {
10605 GetSession()->SendPacket(&data);
10606 }
10607}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition SharedDefines.h:1554
uint32 PreventionType
Definition SpellInfo.h:390
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1987

References AddSpellCooldown(), Unit::BuildCooldownPacket(), SpellInfo::GetSchoolMask(), GetSession(), GetSpellCooldownDelay(), SpellInfo::IsCooldownStartedOnEvent(), m_spells, PLAYERSPELL_REMOVED, SpellInfo::PreventionType, WorldSession::SendPacket(), SPELL_COOLDOWN_FLAG_NONE, SPELL_PREVENTION_TYPE_SILENCE, and sSpellMgr.

◆ QuickEquipItem()

void Player::QuickEquipItem ( uint16  pos,
Item pItem 
)
2836{
2837 if (pItem)
2838 {
2840 AddItemDurations(pItem);
2841
2842 uint8 slot = pos & 255;
2843 VisualizeItem(slot, pItem);
2844
2845 if (IsInWorld())
2846 {
2847 pItem->AddToWorld();
2848 pItem->SendUpdateToPlayer(this);
2849 }
2850
2853
2854 sScriptMgr->OnEquip(this, pItem, (pos >> 8), slot, true);
2855 }
2856}

References ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), AddItemDurations(), Object::AddToWorld(), Object::GetEntry(), Object::IsInWorld(), Object::SendUpdateToPlayer(), sScriptMgr, UpdateAchievementCriteria(), and VisualizeItem().

Referenced by _LoadInventory().

◆ RecalculateRating()

void Player::RecalculateRating ( CombatRating  cr)
inline
1969{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15628{
15629 if (!item->IsRefundable())
15630 {
15631 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15632 return;
15633 }
15634
15635 if (item->IsRefundExpired()) // item refund has expired
15636 {
15637 item->SetNotRefundable(this);
15639 data << item->GetGUID(); // Guid
15640 data << uint32(10); // Error!
15641 GetSession()->SendPacket(&data);
15642 return;
15643 }
15644
15645 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15646 {
15647 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15648 item->SetNotRefundable(this);
15649 return;
15650 }
15651
15652 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15653 if (!iece)
15654 {
15655 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15656 return;
15657 }
15658
15659 bool store_error = false;
15660 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15661 {
15662 uint32 count = iece->reqitemcount[i];
15663 uint32 itemid = iece->reqitem[i];
15664
15665 if (count && itemid)
15666 {
15667 ItemPosCountVec dest;
15668 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15669 if (msg != EQUIP_ERR_OK)
15670 {
15671 store_error = true;
15672 break;
15673 }
15674 }
15675 }
15676
15677 if (store_error)
15678 {
15680 data << item->GetGUID(); // Guid
15681 data << uint32(10); // Error!
15682 GetSession()->SendPacket(&data);
15683 return;
15684 }
15685
15686 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15687 data << item->GetGUID(); // item guid
15688 data << uint32(0); // 0, or error code
15689 data << uint32(item->GetPaidMoney()); // money cost
15690 data << uint32(iece->reqhonorpoints); // honor point cost
15691 data << uint32(iece->reqarenapoints); // arena point cost
15692 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15693 {
15694 data << uint32(iece->reqitem[i]);
15695 data << uint32(iece->reqitemcount[i]);
15696 }
15697 GetSession()->SendPacket(&data);
15698
15699 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15700
15701 // Save all relevant data to DB to prevent desynchronisation exploits
15702 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15703
15704 // Delete any references to the refund data
15705 item->SetNotRefundable(this, true, &trans);
15706
15707 // Destroy item
15708 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15709
15710 // Grant back extendedcost items
15711 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15712 {
15713 uint32 count = iece->reqitemcount[i];
15714 uint32 itemid = iece->reqitem[i];
15715 if (count && itemid)
15716 {
15717 ItemPosCountVec dest;
15718 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15719 ASSERT(msg == EQUIP_ERR_OK);
15720 Item* it = StoreNewItem(dest, itemid, true);
15721 SendNewItem(it, count, true, false, true);
15722 }
15723 }
15724
15725 // Grant back money
15726 if (moneyRefund)
15727 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15728
15729 // Grant back Honor points
15730 if (uint32 honorRefund = iece->reqhonorpoints)
15731 ModifyHonorPoints(honorRefund, trans);
15732
15733 // Grant back Arena points
15734 if (uint32 arenaRefund = iece->reqarenapoints)
15735 ModifyArenaPoints(arenaRefund, trans);
15736
15738
15739 CharacterDatabase.CommitTransaction(trans);
15740}
uint32 GetPaidExtendedCost()
Definition Item.h:349
uint32 GetPaidMoney()
Definition Item.h:348
ObjectGuid::LowType GetRefundRecipient()
Definition Item.h:347
bool IsRefundExpired()
Definition Item.cpp:1253
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7121
@ SMSG_ITEM_REFUND_RESULT
Definition Opcodes.h:1235

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), GetSession(), Item::GetSlot(), Item::IsRefundable(), Item::IsRefundExpired(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SaveInventoryAndGoldToDB(), SendNewItem(), WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_RESULT, and StoreNewItem().

Referenced by WorldSession::HandleItemRefund().

◆ Regenerate()

void Player::Regenerate ( Powers  power)
Todo:
: possible use of miscvalueb instead of amount
1841{
1842 uint32 maxValue = GetMaxPower(power);
1843 if (!maxValue)
1844 return;
1845
1846 //If .cheat power is on always have the max power
1848 {
1849 if (m_regenTimerCount >= 2000)
1850 {
1851 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1852 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1853 {
1854 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1855 }
1856
1857 SetPower(power, maxValue);
1858 return;
1859 }
1860 }
1861
1862 uint32 curValue = GetPower(power);
1863
1866 return;
1867
1868 float addvalue = 0.0f;
1869
1870 switch (power)
1871 {
1872 case POWER_MANA:
1873 {
1874 bool recentCast = IsUnderLastManaUseEffect();
1875 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1876
1877 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1878 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1879
1880 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1881 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1882 else
1883 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1884 }
1885 break;
1886 case POWER_RAGE: // Regenerate rage
1887 {
1888 if (!IsInCombat() && !HasInterruptRegenAura())
1889 {
1890 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1891 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1892 }
1893 }
1894 break;
1895 case POWER_ENERGY:
1896 {
1897 float baseRegenRate = 10.0f * sWorld->getRate(RATE_POWER_ENERGY);
1898 float hasteModifier = 1.0f;
1899
1900 // Apply Vitality
1901 if (HasAura(61329))
1902 hasteModifier += 0.25f;
1903
1904 // Apply Overkill
1905 if (HasAura(58426))
1906 hasteModifier += 0.30f;
1907
1908 // Apply Adrenaline Rush
1909 if (HasAura(13750))
1910 hasteModifier += 1.0f;
1911
1912 float adjustedRegenRate = baseRegenRate * hasteModifier;
1913
1914 addvalue += adjustedRegenRate * 0.001f * m_regenTimer;
1915 }
1916 break;
1917 case POWER_RUNIC_POWER:
1918 {
1919 if (!IsInCombat() && !HasInterruptRegenAura())
1920 {
1921 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1922 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1923 }
1924 }
1925 break;
1926 case POWER_RUNE:
1927 case POWER_FOCUS:
1928 case POWER_HAPPINESS:
1929 break;
1930 case POWER_HEALTH:
1931 return;
1932 default:
1933 break;
1934 }
1935
1936 // Mana regen calculated in Player::UpdateManaRegen()
1937 if (power != POWER_MANA)
1938 {
1940 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1941 if (Powers((*i)->GetMiscValue()) == power)
1942 AddPct(addvalue, (*i)->GetAmount());
1943
1944 // Butchery requires combat for this effect
1945 if (power != POWER_RUNIC_POWER || IsInCombat())
1947 }
1948
1949 if (addvalue < 0.0f)
1950 {
1951 if (curValue == 0)
1952 return;
1953 }
1954 else if (addvalue > 0.0f)
1955 {
1956 if (curValue == maxValue)
1957 return;
1958 }
1959 else
1960 return;
1961
1962 addvalue += m_powerFraction[power];
1963 uint32 integerValue = uint32(std::fabs(addvalue));
1964
1965 bool forcedUpdate = false;
1966 if (addvalue < 0.0f)
1967 {
1968 if (curValue > integerValue)
1969 {
1970 curValue -= integerValue;
1971 m_powerFraction[power] = addvalue + integerValue;
1972 }
1973 else
1974 {
1975 curValue = 0;
1976 m_powerFraction[power] = 0;
1977 forcedUpdate = true;
1978 }
1979 }
1980 else
1981 {
1982 curValue += integerValue;
1983
1984 if (curValue >= maxValue)
1985 {
1986 curValue = maxValue;
1987 m_powerFraction[power] = 0;
1988 forcedUpdate = true;
1989 }
1990 else
1991 {
1992 m_powerFraction[power] = addvalue - integerValue;
1993 }
1994 }
1995
1996 if (m_regenTimerCount >= 2000 || forcedUpdate)
1997 {
1998 SetPower(power, curValue, true, true);
1999 }
2000 else
2001 {
2002 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
2003 }
2004}
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition IWorld.h:179
@ RATE_POWER_RAGE_LOSS
Definition IWorld.h:434
@ RATE_POWER_RUNICPOWER_LOSS
Definition IWorld.h:436
@ RATE_POWER_ENERGY
Definition IWorld.h:438
@ RATE_POWER_MANA
Definition IWorld.h:432
@ CHEAT_POWER
Definition Player.h:1007
@ POWER_HEALTH
Definition SharedDefines.h:278
@ SPELL_AURA_MOD_POWER_REGEN
Definition SpellAuraDefines.h:148
@ SPELL_AURA_PREVENT_REGENERATE_POWER
Definition SpellAuraDefines.h:357
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition UpdateFields.h:112
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:663
bool IsUnderLastManaUseEffect() const
Definition Unit.cpp:17309
bool HasInterruptRegenAura() const
Definition Unit.h:1723
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition Unit.cpp:5785

References AddPct(), CHEAT_POWER, CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), GetCommandStatus(), Object::GetFloatValue(), Unit::GetLevel(), Unit::GetMaxPower(), Unit::GetPower(), Unit::GetTotalAuraModifierByMiscValue(), Unit::HasAura(), Unit::HasAuraTypeWithMiscvalue(), Unit::HasInterruptRegenAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsUnderLastManaUseEffect(), m_powerFraction, Unit::m_regenTimer, m_regenTimerCount, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, RATE_POWER_ENERGY, RATE_POWER_MANA, RATE_POWER_RAGE_LOSS, RATE_POWER_RUNICPOWER_LOSS, Unit::SetPower(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, sWorld, UNIT_FIELD_POWER1, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, and Object::UpdateUInt32Value().

Referenced by RegenerateAll().

◆ RegenerateAll()

void Player::RegenerateAll ( )
1758{
1759 //if (m_regenTimer <= 500)
1760 // return;
1761
1764
1766
1768
1769 // Runes act as cooldowns, and they don't need to send any data
1771 for (uint8 i = 0; i < MAX_RUNES; ++i)
1772 {
1773 // xinef: implement grace
1774 if (int32 cd = GetRuneCooldown(i))
1775 {
1776 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1777 // start grace counter, player must be in combat and rune has to go off cooldown
1778 if (IsInCombat() && cd <= m_regenTimer)
1779 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1780 }
1781 // xinef: if grace is started, increase it but no more than cap
1782 else if (uint32 grace = GetGracePeriod(i))
1783 {
1784 if (grace < RUNE_GRACE_PERIOD)
1785 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1786 }
1787 }
1788
1789 if (m_regenTimerCount >= 2000)
1790 {
1791 // Not in combat or they have regeneration
1795 {
1797 }
1798
1802
1803 m_regenTimerCount -= 2000;
1804 }
1805
1806 m_regenTimer = 0;
1807
1808 // Handles the emotes for drinking and eating.
1809 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1810 // That's why we dont need to reset the timer on apply. In sniffs I have seen that the first call for the spell visual is totally random, then after
1811 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1812 if (m_foodEmoteTimerCount >= 5000)
1813 {
1814 std::vector<AuraEffect*> auraList;
1817
1818 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1819 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1820 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1821
1822 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1823 {
1824 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1825 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1826 {
1828 break;
1829 }
1830 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1831 {
1833 break;
1834 }
1835 }
1836 m_foodEmoteTimerCount -= 5000;
1837 }
1838}
@ RUNE_GRACE_PERIOD
Definition Player.h:408
@ SPELL_VISUAL_KIT_DRINK
Definition SharedDefines.h:350
@ SPELL_VISUAL_KIT_FOOD
Definition SharedDefines.h:349
@ SPELL_AURA_MOD_REGEN
Definition SpellAuraDefines.h:147
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
void Regenerate(Powers power)
Definition Player.cpp:1840
void RegenerateHealth()
Definition Player.cpp:2006
bool IsPolymorphed() const
Definition Unit.cpp:16807
void SendPlaySpellVisual(uint32 id)
Definition Unit.cpp:18977
bool HasRegenDuringCombatAura() const
Definition Unit.h:1749
bool HasHealthRegenInCombatAura() const
Definition Unit.h:1748

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), GetGracePeriod(), GetRuneCooldown(), Unit::HasHealthRegenInCombatAura(), Unit::HasRegenDuringCombatAura(), IsClass(), Unit::IsInCombat(), Unit::IsPolymorphed(), m_baseHealthRegen, m_foodEmoteTimerCount, Unit::m_regenTimer, m_regenTimerCount, MAX_RUNES, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Regenerate(), RegenerateHealth(), RUNE_GRACE_PERIOD, Unit::SendPlaySpellVisual(), SetGracePeriod(), SetRuneCooldown(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_REGEN, SPELL_VISUAL_KIT_DRINK, and SPELL_VISUAL_KIT_FOOD.

Referenced by Update().

◆ RegenerateHealth()

void Player::RegenerateHealth ( )
2007{
2008 uint32 curValue = GetHealth();
2009 uint32 maxValue = GetMaxHealth();
2010
2011 if (curValue >= maxValue)
2012 return;
2013
2014 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
2015
2016 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
2017 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
2018
2019 float addvalue = 0.0f;
2020
2021 // polymorphed case
2022 if (IsPolymorphed())
2023 addvalue = (float)GetMaxHealth() / 3;
2024 // normal regen case (maybe partly in combat case)
2025 else if (!IsInCombat() || HasRegenDuringCombatAura())
2026 {
2027 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
2028
2029 if (!IsStandState())
2030 {
2031 addvalue *= 1.33f;
2032 }
2033
2035 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
2036 {
2037 AddPct(addvalue, (*i)->GetAmount());
2038 }
2039
2040 if (!IsInCombat())
2041 {
2043 }
2044 else if (HasRegenDuringCombatAura())
2045 {
2047 }
2048 }
2049
2050 // always regeneration bonus (including combat)
2052 addvalue += m_baseHealthRegen / 2.5f;
2053
2054 if (addvalue < 0)
2055 addvalue = 0;
2056
2057 ModifyHealth(int32(addvalue));
2058}
@ RATE_HEALTH
Definition IWorld.h:431
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition SpellAuraDefines.h:151
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224
T ApplyPct(T &base, U pct)
Definition Util.h:73
float OCTRegenHPPerSpirit()
Definition Player.cpp:5238
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14157
bool IsStandState() const
Definition Unit.cpp:16786

References AddPct(), ApplyPct(), CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), Unit::GetHealth(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetTotalAuraModifier(), Unit::HasRegenDuringCombatAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsPolymorphed(), Unit::IsStandState(), m_baseHealthRegen, Unit::ModifyHealth(), OCTRegenHPPerSpirit(), RATE_HEALTH, SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_HEALTH_REGEN_PERCENT, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, and sWorld.

Referenced by RegenerateAll().

◆ removeActionButton()

void Player::removeActionButton ( uint8  button)
5659{
5660 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5661 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5662 return;
5663
5664 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5665 m_actionButtons.erase(buttonItr); // new and not saved
5666 else
5667 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5668
5669 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5670}

References ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, Object::GetGUID(), LOG_DEBUG, m_actionButtons, Position::ToString(), and ActionButton::uState.

Referenced by WorldSession::HandleSetActionButtonOpcode().

◆ RemoveActiveQuest()

void Player::RemoveActiveQuest ( uint32  questId,
bool  update = true 
)
1496{
1497 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1498 if (itr != m_QuestStatus.end())
1499 {
1500 m_QuestStatus.erase(itr);
1501 m_QuestStatusSave[questId] = false;
1502 }
1503
1504 if (update)
1505 SendQuestUpdate(questId);
1506
1507 // Xinef: area auras may change on quest remove!
1511}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), WorldObject::GetAreaId(), WorldObject::GetZoneId(), m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveAllSpellCooldown()

void Player::RemoveAllSpellCooldown ( )
3588{
3590 if (!m_spellCooldowns.empty())
3591 {
3592 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3593 if (itr->second.end < infTime)
3594 SendClearCooldown(itr->first, this);
3595
3596 m_spellCooldowns.clear();
3597 }
3598}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition Player.cpp:14689

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4226{
4227 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4228 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4229 {
4230 next = itr;
4231 if (itr->slot == slot)
4232 {
4233 if (itr->item && itr->item->GetEnchantmentId(slot))
4234 {
4235 // Poisons and DK runes are enchants which are allowed on arenas
4236 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4237 {
4238 ++next;
4239 continue;
4240 }
4241 // remove from stats
4242 ApplyEnchantment(itr->item, slot, false, false);
4243 // remove visual
4244 itr->item->ClearEnchantment(slot);
4245 }
4246 // remove from update list
4247 next = m_enchantDuration.erase(itr);
4248 }
4249 else
4250 ++next;
4251 }
4252
4253 // Xinef: check arena allowed enchantments :)
4254 // remove enchants from inventory items
4255 // NOTE: no need to remove these from stats, since these aren't equipped
4256 // in inventory
4258 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4259 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4260 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4261 pItem->ClearEnchantment(slot);
4262
4263 // in inventory bags
4265 if (Bag* pBag = GetBagByPos(i))
4266 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4267 if (Item* pItem = pBag->GetItemByPos(j))
4268 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4269 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4270 pItem->ClearEnchantment(slot);
4271}

References ApplyEnchantment(), GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, m_enchantDuration, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveArenaSpellCooldowns()

void Player::RemoveArenaSpellCooldowns ( bool  removeActivePetCooldowns = false)
3553{
3554 // remove cooldowns on spells that have < 10 min CD
3556 SpellCooldowns::iterator itr, next;
3557 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3558 {
3559 next = itr;
3560 ++next;
3561 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3562 if (!spellInfo)
3563 {
3564 continue;
3565 }
3566
3568 RemoveSpellCooldown(itr->first, true);
3569 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3570 && itr->second.maxduration < 10 * MINUTE * IN_MILLISECONDS) // xinef: dont clear cooldowns that have maxduration > 10 minutes (eg item cooldowns with no spell.dbc cooldown info)
3571 RemoveSpellCooldown(itr->first, true);
3572 }
3573
3574 // pet cooldowns
3575 if (removeActivePetCooldowns)
3576 if (Pet* pet = GetPet())
3577 {
3578 // notify player
3579 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3580 SendClearCooldown(itr2->first, pet);
3581
3582 // actually clear cooldowns
3583 pet->m_CreatureSpellCooldowns.clear();
3584 }
3585}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition SharedDefines.h:547
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3536

References SpellInfo::CategoryRecoveryTime, GameTime::GetGameTimeMS(), GetPet(), SpellInfo::HasAttribute(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, SpellInfo::RecoveryTime, RemoveSpellCooldown(), SendClearCooldown(), SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS, and sSpellMgr.

Referenced by TeleportTo().

◆ RemoveAtLoginFlag()

void Player::RemoveAtLoginFlag ( AtLoginFlags  flags,
bool  persist = false 
)
14675{
14676 m_atLoginFlags &= ~flags;
14677
14678 if (persist)
14679 {
14681
14682 stmt->SetData(0, uint16(flags));
14683 stmt->SetData(1, GetGUID().GetCounter());
14684
14685 CharacterDatabase.Execute(stmt);
14686 }
14687}
@ CHAR_UPD_REM_AT_LOGIN_FLAG
Definition CharacterDatabase.h:275

References CHAR_UPD_REM_AT_LOGIN_FLAG, CharacterDatabase, Object::GetGUID(), m_atLoginFlags, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandlePlayerLoginFromDB(), LoadCorpse(), resetSpells(), Pet::resetTalents(), resetTalents(), and Pet::resetTalentsForAllPetsOf().

◆ RemoveBattlegroundQueueId()

void Player::RemoveBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12306{
12307 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12308 {
12309 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12310 {
12312 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12313 return;
12314 }
12315 }
12316}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BGQueueRemoveEvent::Execute(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::LogoutPlayer(), and Battleground::RemovePlayerAtLeave().

◆ RemoveBonusTalent()

void Player::RemoveBonusTalent ( uint32  count)
inline
1744{ m_extraBonusTalentCount -= count; };

References m_extraBonusTalentCount.

◆ RemoveCategoryCooldown()

void Player::RemoveCategoryCooldown ( uint32  cat)
3545{
3546 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3547 if (i_scstore != sSpellsByCategoryStore.end())
3548 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3549 RemoveSpellCooldown(i_scset->second, true);
3550}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4695{
4696 if (GetCorpse())
4697 {
4699 }
4700
4701 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4702 Corpse::DeleteFromDB(GetGUID(), trans);
4703 CharacterDatabase.CommitTransaction(trans);
4704
4706}
void RemoveFromWorld() override
Definition Corpse.cpp:52

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7771{
7772 // Xinef: If player is not in battleground and not in wintergrasp
7774 return;
7775
7776 // If not released spirit, do it !
7777 if (m_deathTimer > 0)
7778 {
7779 m_deathTimer = 0;
7782 }
7783
7785
7786 // We have to convert player corpse to bones, not to be able to resurrect there
7787 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7788 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7789 if (!bones)
7790 return;
7791
7792 // Now we must make bones lootable, and send player loot
7794
7795 // We store the level of our player in the gold field
7796 // We retrieve this information at Player::SendLoot()
7797 bones->loot.gold = GetLevel();
7798 bones->lootRecipient = looterPlr;
7799 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7800}
@ AREA_WINTERGRASP
Definition BattlefieldWG.h:123
@ LOOT_INSIGNIA
Definition LootMgr.h:90
@ CORPSE_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3133
@ CORPSE_FIELD_DYNAMIC_FLAGS
Definition UpdateFields.h:428
Player * lootRecipient
Definition Corpse.h:78
Loot loot
Definition Corpse.h:77
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition Map.cpp:3642
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition Player.cpp:7809
void BuildPlayerRepop()
Definition Player.cpp:4443
uint32 gold
Definition LootMgr.h:322

References _corpseLocation, AREA_WINTERGRASP, BuildPlayerRepop(), Map::ConvertCorpseToBones(), CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, GetBattlegroundId(), Object::GetGUID(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), WorldObject::GetZoneId(), Loot::gold, Corpse::loot, LOOT_INSIGNIA, Corpse::lootRecipient, m_deathTimer, RepopAtGraveyard(), SendLoot(), Object::SetFlag(), and WorldLocation::WorldRelocate().

Referenced by Spell::EffectSkinPlayerCorpse().

◆ RemoveEnchantmentDurations()

void Player::RemoveEnchantmentDurations ( Item item)
4200{
4201 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4202 {
4203 if (itr->item == item)
4204 {
4205 // save duration in item
4206 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4207 itr = m_enchantDuration.erase(itr);
4208 }
4209 else
4210 ++itr;
4211 }
4212}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition Item.cpp:941

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4215{
4216 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4217 {
4218 if (itr->item == item)
4219 itr = m_enchantDuration.erase(itr);
4220 else
4221 ++itr;
4222 }
4223}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
13141{
13142 //remove existing reference
13143 m_group.unlink();
13144 if (Group* group = GetOriginalGroup())
13145 {
13146 m_group.link(group, this);
13148 }
13149 SetOriginalGroup(nullptr);
13150}
void setSubGroup(uint8 pSubGroup)
Definition GroupReference.h:39
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:13152
Group * GetOriginalGroup()
Definition Player.h:2491
uint8 GetOriginalSubGroup() const
Definition Player.h:2493
void unlink()
Definition Reference.h:62
void link(TO *toObj, FROM *fromObj)
Definition Reference.h:45

References GetOriginalGroup(), GetOriginalSubGroup(), Reference< TO, FROM >::link(), m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::Disband(), and Group::RemoveMember().

◆ RemoveFromGroup() [1/2]

void Player::RemoveFromGroup ( Group group,
ObjectGuid  guid,
RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
static
2368{
2369 if (group)
2370 {
2371 group->RemoveMember(guid, method, kicker, reason);
2372 group = nullptr;
2373 }
2374}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Group.cpp:544

References Group::RemoveMember().

Referenced by DeleteFromDB(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::LogoutPlayer(), and lfg::LFGMgr::UpdateBoot().

◆ RemoveFromGroup() [2/2]

void Player::RemoveFromGroup ( RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT)
inline
1896{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2569{ WhisperList.remove(guid); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ RemoveFromWorld()

void Player::RemoveFromWorld ( )
overridevirtual
  • Release charmed creatures, unsummon totems and remove pets/guardians
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be removed when logging out

Reimplemented from Object.

1715{
1716 // cleanup
1717 if (IsInWorld())
1718 {
1723 ClearComboPoints(); // pussywizard: crashfix
1724 ClearComboPointHolders(); // pussywizard: crashfix
1725 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1726 m_session->DoLootRelease(lguid);
1727 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1728 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1729 sWorldState->HandlePlayerLeaveZone(this, static_cast<WorldStateZoneId>(m_zoneUpdateId));
1730 }
1731
1732 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1733 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1734 {
1735 if (m_items[i])
1737 }
1738
1739 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1740 iter->second->RemoveFromWorld();
1741
1746
1747 if (m_uint32Values)
1748 {
1749 if (WorldObject* viewpoint = GetViewpoint())
1750 {
1751 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1752 SetViewpoint(viewpoint, false);
1753 }
1754 }
1755}
#define LOG_FATAL(filterType__,...)
Definition Log.h:153
WorldStateZoneId
Definition WorldState.h:65
#define sWorldState
Definition WorldState.h:233
void SetViewpoint(WorldObject *target, bool apply)
Definition Player.cpp:13209
void UnsummonPetTemporaryIfAny()
Definition Player.cpp:14255
WorldObject * GetViewpoint() const
Definition Player.cpp:13252
void ClearComboPointHolders()
Definition Unit.cpp:16985
void RemoveFromWorld() override
Definition Unit.cpp:15762
void DoLootRelease(ObjectGuid lguid)
Definition LootHandler.cpp:270

References Unit::ClearComboPointHolders(), Unit::ClearComboPoints(), WorldSession::DoLootRelease(), GetLootGUID(), WorldObject::GetName(), GetViewpoint(), Object::IsInWorld(), LOG_FATAL, m_items, m_session, Object::m_uint32Values, m_zoneUpdateId, mMitems, PLAYER_SLOT_END, PLAYER_SLOT_START, Object::RemoveFromWorld(), Unit::RemoveFromWorld(), sBattlefieldMgr, SetViewpoint(), sOutdoorPvPMgr, StopCastingBindSight(), StopCastingCharm(), sWorldState, and UnsummonPetTemporaryIfAny().

Referenced by Map::RemovePlayerFromMap().

◆ RemoveItem()

void Player::RemoveItem ( uint8  bag,
uint8  slot,
bool  update,
bool  swap = false 
)
2900{
2901 // note: removeitem does not actually change the item
2902 // it only takes the item out of storage temporarily
2903 // note2: if removeitem is to be used for delinking
2904 // the item must be removed from the player's updatequeue
2905
2906 Item* pItem = GetItemByPos(bag, slot);
2907 if (pItem)
2908 {
2909 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2910
2912 RemoveItemDurations(pItem);
2913 RemoveTradeableItem(pItem);
2914
2915 if (bag == INVENTORY_SLOT_BAG_0)
2916 {
2917 if (slot < INVENTORY_SLOT_BAG_END)
2918 {
2919 ItemTemplate const* pProto = pItem->GetTemplate();
2920 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2921
2922 if (pProto && pProto->ItemSet)
2923 RemoveItemsSetItem(this, pProto);
2924
2925 _ApplyItemMods(pItem, slot, false);
2926 }
2927
2928 m_items[slot] = nullptr;
2929
2930 // remove item dependent auras and casts (only weapon and armor slots)
2931 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2932 {
2933 // Xinef: Ensure that this function is called for places with swap=true
2934 if (!swap)
2935 {
2937 }
2938
2939 // remove held enchantments, update expertise
2940 if (slot == EQUIPMENT_SLOT_MAINHAND)
2941 {
2943 }
2944 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2945 {
2947 }
2948
2949 // update armor penetration - passive auras may need it
2950 switch (slot)
2951 {
2956 default:
2957 break;
2958 }
2959 }
2960
2962
2963 if (slot < EQUIPMENT_SLOT_END)
2964 SetVisibleItemSlot(slot, nullptr);
2965 }
2966 else if (Bag* pBag = GetBagByPos(bag))
2967 pBag->RemoveItem(slot, update);
2968
2970 // pItem->SetGuidValue(ITEM_FIELD_OWNER, ObjectGuid::Empty); not clear owner at remove (it will be set at store). This used in mail and auction code
2971 pItem->SetSlot(NULL_SLOT);
2972 if (IsInWorld() && update)
2973 pItem->SendUpdateToPlayer(this);
2974 }
2975}

References _ApplyItemMods(), BASE_ATTACK, CR_ARMOR_PENETRATION, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), ITEM_FIELD_CONTAINED, ItemTemplate::ItemSet, LOG_DEBUG, m_items, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Object::SetGuidValue(), Item::SetSlot(), SetVisibleItemSlot(), and UpdateExpertise().

Referenced by AutoUnequipOffhandIfNeed(), Create(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ RemoveItemDependentAurasAndCasts()

void Player::RemoveItemDependentAurasAndCasts ( Item pItem)
12618{
12619 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12620 {
12621 Aura* aura = itr->second;
12622
12623 // skip passive (passive item dependent spells work in another way) and not self applied auras
12624 SpellInfo const* spellInfo = aura->GetSpellInfo();
12625 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12626 {
12627 ++itr;
12628 continue;
12629 }
12630
12631 // skip if not item dependent or have alternative item
12632 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12633 {
12634 ++itr;
12635 continue;
12636 }
12637
12638 // no alt item, remove aura, restart check
12639 RemoveOwnedAura(itr);
12640 }
12641
12642 // currently casted spells can be dependent from item
12643 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12644 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12645 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12647}
@ SPELL_STATE_DELAYED
Definition Spell.h:231
#define CURRENT_MAX_SPELL
Definition Unit.h:544
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition Player.cpp:12555

References CURRENT_MAX_SPELL, Aura::GetCasterGUID(), Unit::GetCurrentSpell(), Object::GetGUID(), Aura::GetSpellInfo(), HasItemFitToSpellRequirements(), Unit::InterruptSpell(), Aura::IsPassive(), Unit::m_ownedAuras, Unit::RemoveOwnedAura(), and SPELL_STATE_DELAYED.

Referenced by DestroyItem(), WorldSession::HandleAutoEquipItemOpcode(), RemoveItem(), and SwapItem().

◆ RemoveItemDurations()

void Player::RemoveItemDurations ( Item item)
12480{
12481 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12482 {
12483 if (*itr == item)
12484 {
12485 m_itemDuration.erase(itr);
12486 break;
12487 }
12488 }
12489}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
3996{
3997 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
3998 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3999 {
4000 Item* pItem = m_items[slot];
4001 if (pItem)
4002 {
4003 pItem->RemoveFromWorld();
4004 if (del)
4005 pItem->SetState(ITEM_REMOVED, this);
4006 }
4007
4008 m_items[slot] = nullptr;
4009
4010 uint32 eslot = slot - BUYBACK_SLOT_START;
4014
4015 // if current backslot is filled set to now free slot
4017 m_currentBuybackSlot = slot;
4018 }
4019}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, ObjectGuid::Empty, ITEM_REMOVED, LOG_DEBUG, m_currentBuybackSlot, m_items, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, Object::RemoveFromWorld(), Object::SetGuidValue(), Item::SetState(), and Unit::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2868{
2869 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2870 {
2871 if ((*itr)->messageID == id)
2872 {
2873 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2874 m_mail.erase(itr);
2875 return;
2876 }
2877 }
2878}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1689 {
1690 return !!mMitems.erase(itemLowGuid);
1691 }

References mMitems.

Referenced by WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
9095{
9096 if (!pet)
9097 pet = GetPet();
9098
9099 if (pet)
9100 {
9101 // xinef: dont save dead pet as current, save him not in slot
9102 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
9103 {
9104 mode = PET_SAVE_NOT_IN_SLOT;
9106 }
9107
9108 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
9109 if (pet->m_removed)
9110 return;
9111 }
9112
9113 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
9114 {
9115 //returning of reagents only for players, so best done here
9117 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9118
9119 if (spellInfo)
9120 {
9121 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
9122 {
9123 if (spellInfo->Reagent[i] > 0)
9124 {
9125 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
9126 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
9127 if (msg == EQUIP_ERR_OK)
9128 {
9129 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
9130 if (IsInWorld())
9131 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
9132 }
9133 }
9134 }
9135 }
9137 }
9138
9139 if (!pet)
9140 {
9141 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
9142 {
9143 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
9145 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
9146 stmt->SetData(1, GetGUID().GetCounter());
9147 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
9148 CharacterDatabase.Execute(stmt);
9149
9150 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9151 m_petStable->CurrentPet.reset();
9152 }
9153
9154 return;
9155 }
9156 else
9157 {
9158 pet->CombatStop();
9159
9160 // only if current pet in slot
9161 pet->SavePetToDB(mode);
9162
9163 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9164 {
9165 if (mode == PET_SAVE_NOT_IN_SLOT)
9166 {
9167 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9168 m_petStable->CurrentPet.reset();
9169 }
9170 else if (mode == PET_SAVE_AS_DELETED)
9171 m_petStable->CurrentPet.reset();
9172 // else if (stable slots) handled in opcode handlers due to required swaps
9173 // else (current pet) doesnt need to do anything
9174 }
9175
9176 SetMinion(pet, false);
9177
9178 pet->AddObjectToRemoveList();
9179 pet->m_removed = true;
9180
9181 if (pet->isControlled())
9182 {
9184 data << uint64(0);
9185 GetSession()->SendPacket(&data);
9186
9187 if (GetGroup())
9189 }
9190
9192 {
9195 }
9196 }
9197}
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition CharacterDatabase.h:483
#define MAX_SPELL_REAGENTS
Definition DBCStructure.h:1638
@ GROUP_UPDATE_PET
Definition Group.h:120
@ PET_SAVE_AS_DELETED
Definition PetDefines.h:41
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
PetType getPetType() const
Definition Pet.h:52
bool isControlled() const
Definition Pet.h:54
bool m_removed
Definition Pet.h:142
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2482
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition SpellInfo.h:373
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition SpellInfo.h:374
void AddObjectToRemoveList()
Definition Object.cpp:2160
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62
uint32 GetPetNumber() const
Definition CharmInfo.h:132

References WorldObject::AddObjectToRemoveList(), CanStoreNewItem(), CHAR_UPD_CHAR_PET_SLOT_BY_ID, CharacterDatabase, Unit::CombatStop(), EQUIP_ERR_OK, CreatureTemplate::family, WorldObject::FindMap(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetPet(), CharmInfo::GetPetNumber(), Pet::getPetType(), GetSession(), Object::GetUInt32Value(), GROUP_UPDATE_PET, HUNTER_PET, InBattleground(), Unit::IsAlive(), Pet::isControlled(), Object::IsInWorld(), LOG_DEBUG, m_oldpetspell, m_petStable, Pet::m_removed, m_session, m_temporaryUnsummonedPetNumber, MAX_SPELL_REAGENTS, NeedSendSpectatorData(), NULL_BAG, NULL_SLOT, PET_SAVE_AS_CURRENT, PET_SAVE_AS_DELETED, PET_SAVE_NOT_IN_SLOT, WorldSession::PlayerLogout(), SpellInfo::Reagent, SpellInfo::ReagentCount, Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), SendNewItem(), WorldSession::SendPacket(), PreparedStatementBase::SetData(), SetGroupUpdateFlag(), Unit::SetMinion(), SMSG_PET_SPELLS, sSpellMgr, StoreNewItem(), and UNIT_CREATED_BY_SPELL.

Referenced by Spell::_cast(), ActivateSpec(), Spell::EffectSummonPet(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Pet::Remove(), resetTalents(), setDeathState(), SummonPet(), UnsummonPetTemporaryIfAny(), and Update().

◆ RemovePetitionsAndSigns()

void Player::RemovePetitionsAndSigns ( ObjectGuid  guid,
uint32  type 
)
static
10146{
10147 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10148 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10149 {
10150 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10151 if (signItr != itr->second.signatureMap.end())
10152 {
10153 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10154 if (!petition || (type != 10 && type != petition->petitionType))
10155 continue;
10156
10157 // erase this
10158 itr->second.signatureMap.erase(signItr);
10159
10160 // send update if charter owner in game
10162 if (owner)
10163 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10164 }
10165 }
10166
10167 if (type == 10)
10168 {
10170 stmt->SetData(0, guid.GetCounter());
10171 CharacterDatabase.Execute(stmt);
10172 }
10173 else
10174 {
10176 stmt->SetData(0, guid.GetCounter());
10177 stmt->SetData(1, uint8(type));
10178 CharacterDatabase.Execute(stmt);
10179 }
10180
10181 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10182 if (type == 10)
10183 {
10185 stmt->SetData(0, guid.GetCounter());
10186 trans->Append(stmt);
10187
10188 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10189 stmt->SetData(0, guid.GetCounter());
10190 trans->Append(stmt);
10191
10192 // xinef: clear petition store
10193 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10194 }
10195 else
10196 {
10198 stmt->SetData(0, guid.GetCounter());
10199 stmt->SetData(1, uint8(type));
10200 trans->Append(stmt);
10201
10203 stmt->SetData(0, guid.GetCounter());
10204 stmt->SetData(1, uint8(type));
10205 trans->Append(stmt);
10206
10207 // xinef: clear petition store
10208 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10209 }
10210 CharacterDatabase.CommitTransaction(trans);
10211}
@ CHAR_DEL_PETITION_SIGNATURE
Definition CharacterDatabase.h:235
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition CharacterDatabase.h:451
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition CharacterDatabase.h:234
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition CharacterDatabase.h:453
@ CHAR_DEL_PETITION_BY_OWNER
Definition CharacterDatabase.h:450
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition CharacterDatabase.h:452
#define sPetitionMgr
Definition PetitionMgr.h:87
std::map< ObjectGuid, Signatures > SignatureContainer
Definition PetitionMgr.h:52
void SendPetitionQueryOpcode(ObjectGuid petitionguid)
Definition PetitionsHandler.cpp:278
Definition PetitionMgr.h:39
ObjectGuid petitionGuid
Definition PetitionMgr.h:40
ObjectGuid ownerGuid
Definition PetitionMgr.h:41
uint8 petitionType
Definition PetitionMgr.h:42

References CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, CHAR_DEL_PETITION_SIGNATURE, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetSession(), Petition::ownerGuid, Petition::petitionGuid, Petition::petitionType, WorldSession::SendPetitionQueryOpcode(), PreparedStatementBase::SetData(), and sPetitionMgr.

Referenced by Guild::AddMember(), ArenaTeam::AddMember(), and DeleteFromDB().

◆ RemovePlayerFlag()

◆ RemoveQuestSlotState()

void Player::RemoveQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ RemoveReceivedSpectatorResetFor()

void Player::RemoveReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2594{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16202{
16203 uint32 oldRestMask = _restFlagMask;
16204 _restFlagMask &= ~restFlag;
16205
16206 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16207 {
16208 _restTime = 0;
16210 }
16211}

References _restFlagMask, _restTime, PLAYER_FLAGS_RESTING, and RemovePlayerFlag().

Referenced by Update(), UpdateArea(), and UpdateZone().

◆ RemoveRestState()

void Player::RemoveRestState ( )

◆ RemoveRewardedQuest()

void Player::RemoveRewardedQuest ( uint32  questId,
bool  update = true 
)
1514{
1515 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1516 if (rewItr != m_RewardedQuests.end())
1517 {
1518 m_RewardedQuests.erase(rewItr);
1519 m_RewardedQuestsSave[questId] = false;
1520 }
1521
1522 if (update)
1523 SendQuestUpdate(questId);
1524}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13427{
13428 for (uint8 i = 0; i < MAX_RUNES; ++i)
13429 {
13430 if (m_runes->runes[i].ConvertAura == aura)
13431 {
13432 ConvertRune(i, GetBaseRune(i));
13433 SetRuneConvertAura(i, nullptr);
13434 }
13435 }
13436}
AuraEffect const * ConvertAura
Definition Player.h:427

References RuneInfo::ConvertAura, ConvertRune(), GetBaseRune(), m_runes, MAX_RUNES, Runes::runes, and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), and AuraEffect::HandlePeriodicDummyAuraTick().

◆ removeSpell()

void Player::removeSpell ( uint32  spellId,
uint8  removeSpecMask,
bool  onlyTemporary 
)
3346{
3347 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3348 if (itr == m_spells.end())
3349 return;
3350
3351 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3352 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3353 return;
3354
3355 // pussywizard: avoid any possible bugs
3356 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3357 return;
3358
3359 // pussywizard: remove non-talent higher ranks (recursive)
3360 // pussywizard: do this at the beginning, not in the middle of removing!
3361 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3362 if (!GetTalentSpellPos(nextSpell))
3363 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3364
3365 // xinef: if current spell has talentcost, remove spells requiring this spell
3366 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3367 if (GetTalentSpellCost(firstRankSpellId))
3368 {
3369 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3370 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3371 {
3372 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3373 }
3374 }
3375
3376 // pussywizard: re-search, it can be corrupted in prev loop
3377 itr = m_spells.find(spell_id);
3378 if (itr == m_spells.end())
3379 return;
3380
3381 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3382
3383 // pussywizard: some more conditions needed for spells like pyroblast (shouldn't be fully removed when not available in any spec, should stay in db with specMask = 0)
3384 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3385 {
3386 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3387 {
3388 delete itr->second;
3389 m_spells.erase(itr);
3390 }
3391 else
3392 itr->second->State = PLAYERSPELL_REMOVED;
3393 }
3394 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3395 itr->second->State = PLAYERSPELL_CHANGED;
3396
3397 // xinef: this is used for talents and they are not removed in removeSpell function...
3398 // xinef: however ill leave this here just in case
3399 // pussywizard: remove owned aura obtained from currently removed spell
3400 RemoveOwnedAura(spell_id);
3401
3402 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3403 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3404 {
3405 // pussywizard: remove pet auras
3406 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3407 RemovePetAura(petSpell);
3408
3409 // pussywizard: remove all triggered auras
3410 if (spellInfo->Effects[i].TriggerSpell > 0)
3411 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3412 }
3413
3414 // pussywizard: update free primary prof points
3415 if (spellInfo->IsPrimaryProfessionFirstRank())
3416 {
3417 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3418 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3419 SetFreePrimaryProfessions(freeProfs);
3420 }
3421
3422 // pussywizard: update 310 flyer
3423 if (Has310Flyer(false))
3424 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3425 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3426 Has310Flyer(true, spell_id);
3427
3428 // pussywizard: remove dependent skill
3429 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3430 if (spellLearnSkill)
3431 {
3432 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3433
3434 if (!prev_spell) // pussywizard: first rank, remove skill
3435 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3436 else // pussywizard: search previous ranks
3437 {
3438 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3439 while (!prevSkill && prev_spell)
3440 {
3441 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3442 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3443 }
3444
3445 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3446 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3447 else // pussywizard: set to prev skill setting values
3448 {
3449 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3450 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3451 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3452
3453 if (skill_value > prevSkill->value)
3454 skill_value = prevSkill->value;
3455 if (skill_max_value > new_skill_max_value)
3456 skill_max_value = new_skill_max_value;
3457
3458 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3459 }
3460 }
3461 }
3462 else
3463 {
3464 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3465 // most likely will never be used, haven't heard of cases where players unlearn a mount
3466 if (Has310Flyer(false) && spellInfo)
3467 {
3468 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3469 {
3470 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3471 if (!pSkill)
3472 continue;
3473
3474 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3475 {
3476 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3477 {
3478 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3479 spellInfo->Effects[i].CalcValue() == 310)
3480 {
3481 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3482 break;
3483 }
3484 }
3485 }
3486 }
3487 }
3488 }
3489
3490 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3491 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3492 {
3493 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3494 SendLearnPacket(spell_id, false);
3495 }
3496}

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SpellInfo::Effects, GetFreePrimaryProfessionPoints(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetTalentSpellCost(), GetTalentSpellPos(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), SpellInfo::IsPrimaryProfessionFirstRank(), m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SendLearnPacket(), SetFreePrimaryProfessions(), SetSkill(), SpellLearnSkillNode::skill, SKILL_MOUNTS, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSkillLineStore, sSpellMgr, SpellLearnSkillNode::step, and SpellLearnSkillNode::value.

Referenced by _removeTalentAurasAndSpells(), Spell::EffectUnlearnSpecialization(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraOverrideSpells(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), learnSkillRewardedSpells(), ProfessionUnlearnSpells(), removeSpell(), resetSpells(), resetTalents(), and SetSkill().

◆ RemoveSpellCooldown()

◆ RemoveSpellMods()

void Player::RemoveSpellMods ( Spell spell)
10047{
10048 if (!spell)
10049 return;
10050
10051 if (spell->m_appliedMods.empty())
10052 return;
10053
10054 SpellInfo const* const spellInfo = spell->m_spellInfo;
10055
10056 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
10057 {
10058 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
10059 {
10060 SpellModifier* mod = *itr;
10061 ++itr;
10062
10063 // don't handle spells with proc_event entry defined
10064 // this is a temporary workaround, because all spellmods should be handled like that
10065 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
10066 {
10067 continue;
10068 }
10069
10070 // spellmods without aura set cannot be charged
10071 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
10072 continue;
10073
10074 // check if mod affected this spell
10075 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
10076 if (iterMod == spell->m_appliedMods.end())
10077 continue;
10078
10079 // remove from list
10080 // leave this here, if spell have two mods it will remove 2 charges - wrong
10081 spell->m_appliedMods.erase(iterMod);
10082
10083 // MAGE T8P4 BONUS
10084 if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE)
10085 {
10086 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
10087 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
10088 if (sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938)
10089 if (AuraEffect* aurEff = GetAuraEffectDummy(64869))
10090 if (roll_chance_i(aurEff->GetAmount()))
10091 {
10092 mod->charges = 1;
10093 continue;
10094 }
10095 }
10096
10098 itr = m_spellMods[i].begin();
10099 }
10100 }
10101}
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3531
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
#define MAX_SPELLMOD
Definition SpellDefines.h:109
bool IsUsingCharges() const
Definition SpellAuras.h:200
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.h:146
uint32 SpellIconID
Definition SpellInfo.h:380
SpellInfo const *const m_spellInfo
Definition Spell.h:523
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5583

References AURA_REMOVE_BY_EXPIRE, SpellModifier::charges, Aura::DropCharge(), Unit::GetAuraEffectDummy(), Aura::GetSpellInfo(), Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, MAX_SPELLMOD, SpellModifier::ownerAura, roll_chance_i(), SPELLFAMILY_MAGE, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SpellModifier::spellId, and sSpellMgr.

Referenced by Spell::_cast().

◆ RemoveTimedAchievement()

void Player::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
13967{
13969}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition AchievementMgr.cpp:2249

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by InstanceScript::DoStopTimedAchievement(), and WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1566{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1128{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Unit::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4941{
4942 // note: this can be called also when the player is alive
4943 // for example from WorldSession::HandleMovementOpcodes
4944
4945 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4946
4947 if (!sScriptMgr->CanRepopAtGraveyard(this))
4948 return;
4949
4950 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4951 // Xinef: Get Transport Check is not needed
4952 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4953 {
4954 ResurrectPlayer(0.5f);
4956 }
4957
4958 GraveyardStruct const* ClosestGrave = nullptr;
4959
4960 // Special handle for battleground maps
4961 if (Battleground* bg = GetBattleground())
4962 ClosestGrave = bg->GetClosestGraveyard(this);
4963 else
4964 {
4965 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4966 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4967 else
4968 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4969 }
4970
4971 // stop countdown until repop
4972 m_deathTimer = 0;
4973
4974 // if no grave found, stay at the current location
4975 // and don't show spirit healer location
4976 if (ClosestGrave)
4977 {
4978 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4979 if (isDead()) // not send if alive, because it used in TeleportTo()
4980 {
4981 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4982 data << ClosestGrave->Map;
4983 data << ClosestGrave->x;
4984 data << ClosestGrave->y;
4985 data << ClosestGrave->z;
4986 GetSession()->SendPacket(&data);
4987 }
4988 }
4989 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4991
4993}
@ AREA_FLAG_NEED_FLY
Definition DBCEnums.h:246
#define sGraveyard
Definition GameGraveyard.h:74
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:493
@ SMSG_DEATH_RELEASE_LOC
Definition Opcodes.h:918
Definition GameGraveyard.h:27
float z
Definition GameGraveyard.h:32
float x
Definition GameGraveyard.h:30
float y
Definition GameGraveyard.h:31
uint32 Map
Definition GameGraveyard.h:29

References AREA_FLAG_NEED_FLY, AreaTableEntry::flags, WorldObject::GetAreaId(), GetBattleground(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), GetTeamId(), WorldObject::GetZoneId(), Unit::IsAlive(), Unit::isDead(), m_deathTimer, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GraveyardStruct::Map, PLAYER_FLAGS_IS_OUT_OF_BOUNDS, RemovePlayerFlag(), ResurrectPlayer(), sAreaTableStore, sBattlefieldMgr, WorldSession::SendPacket(), sGraveyard, SMSG_DEATH_RELEASE_LOC, SpawnCorpseBones(), sScriptMgr, TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by Spell::EffectStuck(), HandleDrowning(), WorldSession::HandleInstanceLockResponse(), WorldSession::HandleRepopRequestOpcode(), misc_commandscript::HandleUnstuckCommand(), WorldSession::LogoutPlayer(), RemovedInsignia(), TeleportTo(), Update(), and UpdateHomebindTime().

◆ ReportedAfkBy()

void Player::ReportedAfkBy ( Player reporter)

This player has been blamed to be inactive in a battleground.

11416{
11418 // Battleground also must be in progress!
11419 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11420 return;
11421
11422 // Xinef: 2 minutes startup + 2 minute of match
11424 return;
11425
11426 // check if player has 'Idle' or 'Inactive' debuff
11427 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11428 {
11429 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11430 // by default 3 players have to complain to apply debuff
11431 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11432 {
11433 // cast 'Idle' spell
11434 CastSpell(this, 43680, true);
11435 m_bgData.bgAfkReporter.clear();
11436 }
11437 }
11438}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition IWorld.h:313
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition IWorld.h:314
uint32 GetStartTime() const
Definition Battleground.h:334
bool CanReportAfkDueToLimit()
Definition Player.cpp:11405

References BGData::bgAfkReporter, CanReportAfkDueToLimit(), Unit::CastSpell(), CONFIG_BATTLEGROUND_REPORT_AFK, CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, GetBattleground(), Object::GetGUID(), Battleground::GetStartTime(), Battleground::GetStatus(), GetTeamId(), Unit::HasAura(), IN_MILLISECONDS, m_bgData, MINUTE, STATUS_IN_PROGRESS, and sWorld.

Referenced by WorldSession::HandleReportPvPAFK().

◆ ReputationChanged()

void Player::ReputationChanged ( FactionEntry const *  factionEntry)
2209{
2210 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2211 {
2212 if (uint32 questid = GetQuestSlotQuestId(i))
2213 {
2214 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2215 {
2216 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2217 {
2218 QuestStatusData& q_status = m_QuestStatus[questid];
2219 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2220 {
2221 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2222 if (CanCompleteQuest(questid))
2223 CompleteQuest(questid);
2224 }
2225 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2226 {
2227 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2228 IncompleteQuest(questid);
2229 }
2230 }
2231 }
2232 }
2233 }
2234}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by ReputationMgr::SetOneFactionReputation().

◆ ReputationChanged2()

void Player::ReputationChanged2 ( FactionEntry const *  factionEntry)
2237{
2238 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2239 {
2240 if (uint32 questid = GetQuestSlotQuestId(i))
2241 {
2242 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2243 {
2244 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2245 {
2246 QuestStatusData& q_status = m_QuestStatus[questid];
2247 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2248 {
2249 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2250 if (CanCompleteQuest(questid))
2251 CompleteQuest(questid);
2252 }
2253 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2254 {
2255 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2256 IncompleteQuest(questid);
2257 }
2258 }
2259 }
2260 }
2261 }
2262}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

◆ ResetAchievementCriteria()

void Player::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
13972{
13973 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13974}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition AchievementMgr.cpp:515

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13947{
13949}
void Reset()
Definition AchievementMgr.cpp:491

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1878 {
1882 }
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:487
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
void ClearUnitState(uint32 f)
Definition Unit.h:708

References Unit::ClearUnitState(), m_contestedPvPTimer, PLAYER_FLAGS_CONTESTED_PVP, RemovePlayerFlag(), and UNIT_STATE_ATTACK_PLAYER.

Referenced by SetGameMaster(), SetIsSpectator(), and UpdateContestedPvP().

◆ ResetDailyQuestStatus()

void Player::ResetDailyQuestStatus ( )
12192{
12193 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12194 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12195
12196 m_DFQuests.clear(); // Dungeon Finder Quests.
12197
12198 // DB data deleted in caller
12199 m_DailyQuestChanged = false;
12201}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Unit::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16312{
16313 _farSightDistance.reset();
16314}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ ResetInstances()

void Player::ResetInstances ( ObjectGuid  guid,
uint8  method,
bool  isRaid 
)
static

Reset all solo instances and optionally send a message on success for each.

196{
197 switch (method)
198 {
200 {
202 if (!p || p->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
203 break;
204 std::vector<InstanceSave*> toUnbind;
205 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
206 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
207 {
208 InstanceSave* instanceSave = itr->second.save;
209 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
210 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
211 {
212 continue;
213 }
214
215 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
216 if (!map || map->ToInstanceMap()->Reset(method))
217 {
218 p->SendResetInstanceSuccess(instanceSave->GetMapId());
219 toUnbind.push_back(instanceSave);
220 }
221 else
222 {
223 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
224 }
225
226 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
227 }
228 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
229 {
230 sInstanceSaveMgr->UnbindAllFor(*itr);
231 }
232 }
233 break;
235 {
237 if (!p)
238 break;
239 std::vector<InstanceSave*> toUnbind;
240 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), p->GetDifficulty(isRaid));
241 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
242 {
243 InstanceSave* instanceSave = itr->second.save;
244 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
245 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
246 {
247 continue;
248 }
249
250 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
251 if (!map || map->ToInstanceMap()->Reset(method))
252 {
253 p->SendResetInstanceSuccess(instanceSave->GetMapId());
254 toUnbind.push_back(instanceSave);
255 }
256 else
257 {
258 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
259 }
260
261 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
262 }
263 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
264 sInstanceSaveMgr->UnbindAllFor(*itr);
265 }
266 break;
268 {
270 if (!p)
271 break;
272 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
273 {
274 std::vector<InstanceSave*> toUnbind;
275 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(d));
276 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
277 {
278 if (itr->second.perm)
279 continue;
280 InstanceSave* instanceSave = itr->second.save;
281 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
282 if (!map || p->FindMap() != map)
283 {
284 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
285 toUnbind.push_back(instanceSave);
286 }
287 //else
288 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
289
290 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
291 }
292 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
293 sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
294 }
295 }
296 break;
298 {
300 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
301 {
302 std::vector<InstanceSave*> toUnbind;
303 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(guid, Difficulty(d));
304 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
305 {
306 if (itr->second.perm)
307 continue;
308 InstanceSave* instanceSave = itr->second.save;
309 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
310 if (!p || !map || p->FindMap() != map)
311 {
312 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
313 toUnbind.push_back(instanceSave);
314 }
315 //else
316 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
317 }
318 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
319 sInstanceSaveMgr->PlayerUnbindInstance(guid, (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
320 }
321 }
322 break;
323 }
324}
#define MAX_DIFFICULTY
Definition DBCEnums.h:283
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition InstanceSaveMgr.h:46
@ INSTANCE_RESET_GROUP_JOIN
Definition Map.h:812
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition Map.h:810
@ INSTANCE_RESET_GROUP_LEAVE
Definition Map.h:813
@ INSTANCE_RESET_ALL
Definition Map.h:809
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition Map.cpp:3119
uint32 GetMapId() const
Definition InstanceSaveMgr.h:62
bool CanReset() const
Definition InstanceSaveMgr.h:81
InstanceMap * ToInstanceMap()
Definition Map.h:544
void SendResetInstanceSuccess(uint32 MapId)
Definition PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition PlayerMisc.cpp:333

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, ObjectAccessor::FindConnectedPlayer(), WorldObject::FindMap(), GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_JOIN, INSTANCE_RESET_GROUP_LEAVE, MapEntry::IsRaid(), MAX_DIFFICULTY, InstanceMap::Reset(), SendResetInstanceFailed(), SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by Group::AddMember(), Group::Disband(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), and Group::RemoveMember().

◆ ResetMap()

void Player::ResetMap ( )
overridevirtual

Reimplemented from WorldObject.

14701{
14702 // this may be called during Map::Update
14703 // after decrement+unlink, ++m_mapRefIter will continue correctly
14704 // when the first element of the list is being removed
14705 // nocheck_prev will return the padding element of the RefMgr
14706 // instead of nullptr in the case of prev
14707 GetMap()->UpdateIteratorBack(this);
14709 GetMapRef().unlink();
14710}
void UpdateIteratorBack(Player *player)
Definition Map.cpp:3357
MapReference & GetMapRef()
Definition Player.h:2499
virtual void ResetMap()
Definition Object.cpp:2142

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12224{
12225 if (m_monthlyquests.empty())
12226 return;
12227
12228 m_monthlyquests.clear();
12229 // DB data deleted in caller
12230 m_MonthlyQuestChanged = false;
12231}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8926{
8927 // This needs another gossip option + NPC text as a confirmation.
8928 // The confirmation gossip listid has the text: "Yes, please do."
8929 Pet* pet = GetPet();
8930
8931 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8932 return;
8933
8934 CharmInfo* charmInfo = pet->GetCharmInfo();
8935 if (!charmInfo)
8936 {
8937 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8938 return;
8939 }
8940 pet->resetTalents();
8941 SendTalentsInfoData(true);
8942}
uint32 m_usedTalentCount
Definition Pet.h:134
bool resetTalents()
Definition Pet.cpp:2054

References Unit::GetCharmInfo(), Object::GetGUID(), GetPet(), Pet::getPetType(), HUNTER_PET, LOG_ERROR, Pet::m_usedTalentCount, Pet::resetTalents(), SendTalentsInfoData(), and ObjectGuid::ToString().

Referenced by OnGossipSelect(), and npc_pet_trainer::npc_pet_trainerAI::sGossipSelect().

◆ ResetSeasonalQuestStatus()

void Player::ResetSeasonalQuestStatus ( uint16  event_id)
12214{
12215 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12216 return;
12217
12218 m_seasonalquests.erase(event_id);
12219 // DB data deleted in caller
12220 m_SeasonalQuestChanged = false;
12221}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11857{
11858 // not need after this call
11861
11862 // make full copy of map (spells removed and marked as deleted at another spell remove
11863 // and we can't use original map for safe iterative with visit each spell at loop end
11864 PlayerSpellMap spellMap = GetSpellMap();
11865
11866 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11867 removeSpell(iter->first, SPEC_MASK_ALL, false);
11868
11872}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:193
@ AT_LOGIN_RESET_SPELLS
Definition Player.h:606
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1780

References AT_LOGIN_RESET_SPELLS, GetSpellMap(), HasAtLoginFlag(), LearnCustomSpells(), LearnDefaultSkills(), learnQuestRewardedSpells(), RemoveAtLoginFlag(), removeSpell(), and SPEC_MASK_ALL.

Referenced by WorldSession::HandlePlayerLoginFromDB(), and reset_commandscript::HandleResetSpellsCommand().

◆ resetTalents()

bool Player::resetTalents ( bool  noResetCost = false)
3718{
3719 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3720
3721 // xinef: remove at login flag upon talents reset
3724
3725 // xinef: get max available talent points amount
3726 uint32 talentPointsForLevel = CalculateTalentsPoints();
3727
3728 // xinef: no talent points are used, return
3729 if (m_usedTalentCount == 0)
3730 return false;
3732
3733 // xinef: check if we have enough money
3734 uint32 resetCost = 0;
3735 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3736 {
3737 resetCost = resetTalentsCost();
3738 if (!HasEnoughMoney(resetCost))
3739 {
3741 return false;
3742 }
3743 }
3744
3745 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3746
3747 // xinef: reset talents
3748 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3749 {
3750 PlayerTalentMap::iterator itr = iter++;
3751
3752 if (itr->second->State == PLAYERSPELL_REMOVED)
3753 continue;
3754
3755 // xinef: talent not in current spec
3756 if (!(itr->second->specMask & GetActiveSpecMask()))
3757 continue;
3758
3759 // xinef: remove talent auras
3760 _removeTalentAurasAndSpells(itr->first);
3761
3762 // xinef: check if talent learns spell to spell book
3763 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3764 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3765
3766 bool removed = false;
3767 if (talentInfo->addToSpellBook)
3768 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3769 {
3770 removeSpell(itr->first, GetActiveSpecMask(), false);
3771 removed = true;
3772 }
3773
3774 // Xinef: send unlearn spell packet at talent remove
3775 if (!removed)
3776 SendLearnPacket(itr->first, false);
3777
3778 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3779 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3780 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3781 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3782
3783 // xinef: remove talent modifies m_talents, move itr to map begin
3785 }
3786
3787 // xinef: remove titan grip if player had it set
3788 if (m_canTitanGrip)
3789 SetCanTitanGrip(false);
3790 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3791 if (!HasSpell(674) && m_canDualWield)
3792 SetCanDualWield(false);
3793
3795
3796 // pussywizard: removed saving to db, nothing important happens and saving only spells and talents may cause data integrity problems (eg. with skills saved to db)
3797 SetFreeTalentPoints(talentPointsForLevel);
3798
3799 if (!noResetCost)
3800 {
3801 ModifyMoney(-(int32)resetCost);
3804
3805 m_resetTalentsCost = resetCost;
3807 }
3808
3809 return true;
3810}
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition DBCEnums.h:174
@ CONFIG_NO_RESET_TALENT_COST
Definition IWorld.h:130
@ AT_LOGIN_RESET_TALENTS
Definition Player.h:607
uint32 resetTalentsCost() const
Definition Player.cpp:3684

References _removeTalent(), _removeTalentAurasAndSpells(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, TalentEntry::addToSpellBook, AT_LOGIN_RESET_TALENTS, AutoUnequipOffhandIfNeed(), BUY_ERR_NOT_ENOUGHT_MONEY, CalculateTalentsPoints(), CONFIG_NO_RESET_TALENT_COST, SpellInfo::Effects, GetActiveSpecMask(), GameTime::GetGameTime(), HasAtLoginFlag(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasEnoughMoney(), HasSpell(), Unit::m_canDualWield, m_canTitanGrip, m_resetTalentsCost, m_resetTalentsTime, m_talents, m_usedTalentCount, MAX_SPELL_EFFECTS, ModifyMoney(), PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, RemoveAtLoginFlag(), RemovePet(), removeSpell(), resetTalentsCost(), SendBuyError(), SendLearnPacket(), Unit::SetCanDualWield(), SetCanTitanGrip(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleTalentWipeConfirmOpcode(), and InitTalentForLevel().

◆ resetTalentsCost()

uint32 Player::resetTalentsCost ( ) const
3685{
3686 // The first time reset costs 1 gold
3687 if (m_resetTalentsCost < 1 * GOLD)
3688 return 1 * GOLD;
3689 // then 5 gold
3690 else if (m_resetTalentsCost < 5 * GOLD)
3691 return 5 * GOLD;
3692 // After that it increases in increments of 5 gold
3693 else if (m_resetTalentsCost < 10 * GOLD)
3694 return 10 * GOLD;
3695 else
3696 {
3697 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3698 if (months > 0)
3699 {
3700 // This cost will be reduced by a rate of 5 gold per month
3701 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3702 // to a minimum of 10 gold.
3703 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3704 }
3705 else
3706 {
3707 // After that it increases in increments of 5 gold
3708 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3709 // until it hits a cap of 50 gold.
3710 if (new_cost > 50 * GOLD)
3711 new_cost = 50 * GOLD;
3712 return new_cost;
3713 }
3714 }
3715}
constexpr auto MONTH
Definition Common.h:51
@ GOLD
Definition SharedDefines.h:253

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12204{
12205 if (m_weeklyquests.empty())
12206 return;
12207
12208 m_weeklyquests.clear();
12209 // DB data deleted in caller
12210 m_WeeklyQuestChanged = false;
12211}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
10040{
10041 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
10042 if (m_currentSpells[i])
10043 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
10044}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9972
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2078

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13439{
13440 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13441 // If rune was converted by a non-pasive aura that still active we should keep it converted
13442 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13443 return;
13444 ConvertRune(index, GetBaseRune(index));
13445 SetRuneConvertAura(index, nullptr);
13446 // Don't drop passive talents providing rune convertion
13447 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13448 return;
13449 for (uint8 i = 0; i < MAX_RUNES; ++i)
13450 {
13451 if (aura == m_runes->runes[i].ConvertAura)
13452 return;
13453 }
13454 aura->GetBase()->Remove();
13455}
@ SPELL_AURA_CONVERT_RUNE
Definition SpellAuraDefines.h:312
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:447
Aura * GetBase() const
Definition SpellAuraEffects.h:49

References RuneInfo::ConvertAura, ConvertRune(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), GetBaseRune(), AuraEffect::GetSpellInfo(), SpellInfo::HasAttribute(), m_runes, MAX_RUNES, Aura::Remove(), Runes::runes, SetRuneConvertAura(), SPELL_ATTR0_PASSIVE, and SPELL_AURA_CONVERT_RUNE.

Referenced by Spell::TakeRunePower().

◆ RestoreHealthAfterDuel()

void Player::RestoreHealthAfterDuel ( )
inline
uint32 healthBeforeDuel
Definition Player.h:3002

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition Player.h:3003

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9973{
9974 if (!spell || spell->m_appliedMods.empty())
9975 return;
9976
9977 std::list<Aura*> aurasQueue;
9978
9979 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9980 {
9981 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9982 {
9983 SpellModifier* mod = *itr;
9984
9985 // Spellmods without aura set cannot be charged
9986 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9987 continue;
9988
9989 // Restore only specific owner aura mods
9990 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9991 continue;
9992
9993 if (aura && mod->ownerAura != aura)
9994 continue;
9995
9996 // Check if mod affected this spell
9997 // First, check if the mod aura applied at least one spellmod to this spell
9998 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9999 if (iterMod == spell->m_appliedMods.end())
10000 continue;
10001 // Second, check if the current mod is one of those applied by the mod aura
10002 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
10003 continue;
10004
10005 // remove from list - This will be done after all mods have been gone through
10006 // to ensure we iterate over all mods of an aura before removing said aura
10007 // from applied mods (Else, an aura with two mods on the current spell would
10008 // only see the first of its modifier restored)
10009 aurasQueue.push_back(mod->ownerAura);
10010
10011 // add mod charges back to mod
10012 if (mod->charges == -1)
10013 mod->charges = 1;
10014 else
10015 mod->charges++;
10016
10017 // Do not set more spellmods than available
10018 if (mod->ownerAura->GetCharges() < mod->charges)
10019 mod->charges = mod->ownerAura->GetCharges();
10020
10021 // Skip this check for now - aura charges may change due to various reason
10023 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
10024 }
10025 }
10026
10027 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
10028 {
10029 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
10030 if (iterMod != spell->m_appliedMods.end())
10031 spell->m_appliedMods.erase(iterMod);
10032 }
10033
10034 // Xinef: clear the list just do be sure
10035 if (!ownerAuraId && !aura)
10036 spell->m_appliedMods.clear();
10037}
uint8 GetCharges() const
Definition SpellAuras.h:141
flag96 SpellFamilyFlags
Definition SpellInfo.h:388

References SpellModifier::charges, Aura::GetCharges(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, SpellModifier::mask, MAX_SPELLMOD, SpellModifier::ownerAura, and SpellInfo::SpellFamilyFlags.

Referenced by Spell::DoAllEffectOnTarget(), Spell::finish(), Unit::HandleDummyAuraProc(), and RestoreAllSpellMods().

◆ ResummonPetTemporaryUnSummonedIfAny()

void Player::ResummonPetTemporaryUnSummonedIfAny ( )
14271{
14273 return;
14274
14275 // not resummon in not appropriate state
14277 return;
14278
14279 if (GetPetGUID())
14280 return;
14281
14283 return;
14284
14285 Pet* newPet = new Pet(this);
14286 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14287 delete newPet;
14288
14290}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition Player.h:2425
uint32 GetLastPetSpell() const
Definition Player.h:2467
bool CanResummonPet(uint32 spellid)
Definition Player.cpp:14292

References CanResummonPet(), GetLastPetSpell(), Unit::GetPetGUID(), IsPetNeedBeTemporaryUnsummoned(), IsSpectator(), Pet::LoadPetFromDB(), and m_temporaryUnsummonedPetNumber.

Referenced by Unit::_ExitVehicle(), WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ResurectUsingRequestData()

void Player::ResurectUsingRequestData ( )

Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse

12866{
12869
12870 if (IsBeingTeleported())
12871 {
12873 return;
12874 }
12875
12876 ResurrectPlayer(0.0f, false);
12877
12880 else
12881 SetFullHealth();
12882
12885 else
12887
12888 SetPower(POWER_RAGE, 0);
12889
12891
12893}
void ScheduleDelayedOperation(uint32 operation)
Definition Player.h:2107
float m_resurrectZ
Definition Player.h:2851
uint32 m_resurrectMap
Definition Player.h:2850
float m_resurrectX
Definition Player.h:2851
float m_resurrectY
Definition Player.h:2851

References DELAYED_RESURRECT_PLAYER, Unit::GetMaxHealth(), Unit::GetMaxPower(), Position::GetOrientation(), IsBeingTeleported(), m_resurrectHealth, m_resurrectMana, m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, POWER_ENERGY, POWER_MANA, POWER_RAGE, ResurrectPlayer(), ScheduleDelayedOperation(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), and TeleportTo().

Referenced by WorldSession::HandleResurrectResponseOpcode().

◆ ResurrectPlayer()

void Player::ResurrectPlayer ( float  restore_percent,
bool  applySickness = false 
)
4493{
4494 if (!sScriptMgr->CanPlayerResurrect(this))
4495 return;
4496
4497 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4498 data << uint32(-1);
4499 data << float(0);
4500 data << float(0);
4501 data << float(0);
4502 GetSession()->SendPacket(&data);
4503
4504 // speed change, land walk
4505
4506 // remove death flag + set aura
4508 RemoveAurasDueToSpell(20584); // speed bonuses
4509 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4510
4511 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4513
4517 SetWaterWalking(false);
4518 m_deathTimer = 0;
4519
4520 // set health/powers (0- will be set in caller)
4521 if (restore_percent > 0.0f)
4522 {
4523 SetHealth(uint32(GetMaxHealth()*restore_percent));
4524 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4525 SetPower(POWER_RAGE, 0);
4527 }
4528
4529 // trigger update zone for alive state zone updates
4530 uint32 newzone, newarea;
4531 GetZoneAndAreaId(newzone, newarea);
4532 UpdateZone(newzone, newarea);
4533 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4534
4535 if (Battleground* bg = GetBattleground())
4536 bg->HandlePlayerResurrect(this);
4537
4538 // update visibility
4540
4541 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4542
4543 if (!applySickness)
4544 {
4545 return;
4546 }
4547
4548 //Characters from level 1-10 are not affected by resurrection sickness.
4549 //Characters from level 11-19 will suffer from one minute of sickness
4550 //for each level they are above 10.
4551 //Characters level 20 and up suffer from ten minutes of sickness.
4552 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4553
4554 if (int32(GetLevel()) >= startLevel)
4555 {
4556 // set resurrection sickness
4557 CastSpell(this, 15007, true);
4558
4559 // not full duration
4560 if (int32(GetLevel()) < startLevel + 9)
4561 {
4562 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4563
4564 if (Aura* aur = GetAura(15007, GetGUID()))
4565 {
4566 aur->SetDuration(delta * IN_MILLISECONDS);
4567 }
4568 }
4569 }
4570}
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition IWorld.h:305
@ MOVE_LAND_WALK
Definition Player.h:464
@ UNIT_BYTE1_FLAG_GROUND
Definition UnitDefines.h:58
void UpdateZone(uint32 newZone, uint32 newArea)
Definition PlayerUpdates.cpp:1247
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition PlayerUpdates.cpp:1609
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition Object.cpp:3175

References Alive, Unit::CastSpell(), CONFIG_DEATH_SICKNESS_LEVEL, Unit::GetAura(), GetBattleground(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), GetSession(), WorldObject::GetZoneAndAreaId(), IN_MILLISECONDS, m_deathTimer, MINUTE, MOVE_LAND_WALK, MOVE_UNROOT, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasDueToSpell(), WorldSession::SendPacket(), Object::SetByteValue(), setDeathState(), Object::SetDynamicFlag(), Unit::SetHealth(), SetMovement(), Unit::SetPower(), SetWaterWalking(), SMSG_DEATH_RELEASE_LOC, sOutdoorPvPMgr, sScriptMgr, sWorld, UNIT_BYTE1_FLAG_GROUND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_BYTES_1, UpdateObjectVisibility(), and UpdateZone().

Referenced by Battleground::_ProcessResurrect(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), LoadFromDB(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ ResyncRunes()

void Player::ResyncRunes ( uint8  count)
13468{
13469 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13470 data << uint32(count);
13471 for (uint32 i = 0; i < count; ++i)
13472 {
13473 data << uint8(GetCurrentRune(i)); // rune type
13474 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13475 }
13476 GetSession()->SendPacket(&data);
13477}
RuneType GetCurrentRune(uint8 index) const
Definition Player.h:2515
@ SMSG_RESYNC_RUNES
Definition Opcodes.h:1189

References GetCurrentRune(), GetRuneCooldown(), GetSession(), WorldSession::SendPacket(), and SMSG_RESYNC_RUNES.

◆ RewardExtraBonusTalentPoints()

void Player::RewardExtraBonusTalentPoints ( uint32  bonusTalentPoints)

A talent point boost. Usage: 1). Hot update situation (occurred when character is online, like PlayerScript:OnAchiComplete): Right after calling this function, character can reward talent points by calling function player->InitTalentForLevel().

2). Data initing situation (like PlayerScript:OnLoadFromDB)

6088{
6089 if (bonusTalentPoints)
6090 {
6091 m_extraBonusTalentCount += bonusTalentPoints;
6092 }
6093}

References m_extraBonusTalentCount.

◆ RewardHonor()

bool Player::RewardHonor ( Unit uVictim,
uint32  groupsize,
int32  honor = -1,
bool  awardXP = true 
)

Calculate the amount of honor gained based on the victim and the size of the group for which the honor is divided An exact honor value can also be given (overriding the calcs)

6099{
6100 // do not reward honor in arenas, but enable onkill spellproc
6101 if (InArena())
6102 {
6103 if (!uVictim || uVictim == this || !uVictim->IsPlayer())
6104 return false;
6105
6106 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
6107 return false;
6108
6109 return true;
6110 }
6111
6112 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
6114 return false;
6115
6116 /* check if player has same IP
6117 if (uVictim && uVictim->IsPlayer())
6118 {
6119 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
6120 return false;
6121 }
6122 */
6123
6124 ObjectGuid victim_guid;
6125 uint32 victim_rank = 0;
6126
6127 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
6129
6130 // do not reward honor in arenas, but return true to enable onkill spellproc
6131 if (InArena())
6132 return true;
6133
6134 // Promote to float for calculations
6135 float honor_f = (float)honor;
6136
6137 if (honor_f <= 0)
6138 {
6139 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6140 return false;
6141
6142 victim_guid = uVictim->GetGUID();
6143
6144 if (uVictim->IsPlayer())
6145 {
6146 Player* victim = uVictim->ToPlayer();
6147
6148 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6149 return false;
6150
6151 uint8 k_level = GetLevel();
6152 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6153 uint8 v_level = victim->GetLevel();
6154
6155 if (v_level <= k_grey)
6156 return false;
6157
6158 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6159 // [0] Just name
6160 // [1..14] Alliance honor titles and player name
6161 // [15..28] Horde honor titles and player name
6162 // [29..38] Other title and player name
6163 // [39+] Nothing
6164 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6165 uint32 killer_title = 0;
6166 sScriptMgr->OnVictimRewardBefore(this, victim, killer_title, victim_title);
6167 // Get Killer titles, CharTitlesEntry::bit_index
6168 // Ranks:
6169 // title[1..14] -> rank[5..18]
6170 // title[15..28] -> rank[5..18]
6171 // title[other] -> 0
6172 if (victim_title == 0)
6173 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6174 else if (victim_title < 15)
6175 victim_rank = victim_title + 4;
6176 else if (victim_title < 29)
6177 victim_rank = victim_title - 14 + 4;
6178 else
6179 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6180
6181 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6182
6183 // count the number of playerkills in one day
6185 // and those in a lifetime
6193 sScriptMgr->OnVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6194 }
6195 else
6196 {
6197 if (!uVictim->ToCreature()->IsRacialLeader())
6198 return false;
6199
6200 honor_f = 100.0f; // ??? need more info
6201 victim_rank = 19; // HK: Leader
6202 }
6203 }
6204
6205 if (uVictim)
6206 {
6207 if (groupsize > 1)
6208 honor_f /= groupsize;
6209
6210 // apply honor multiplier from aura (not stacking-get highest)
6212 }
6213
6214 honor_f *= sWorld->getRate(RATE_HONOR);
6215 // Back to int now
6216 honor = int32(honor_f);
6217 // honor - for show honor points in log
6218 // victim_guid - for show victim name in log
6219 // victim_rank [1..4] HK: <dishonored rank>
6220 // victim_rank [5..19] HK: <alliance\horde rank>
6221 // victim_rank [0, 20+] HK: <>
6222 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6223 data << honor;
6224 data << victim_guid;
6225 data << victim_rank;
6226
6227 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6228 if (uVictim || groupsize > 0)
6229 GetSession()->SendPacket(&data);
6230
6231 // add honor points
6232 ModifyHonorPoints(honor);
6233
6235
6236 // Xinef: Battleground experience
6237 if (awardXP)
6238 if (Battleground* bg = GetBattleground())
6239 {
6240 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6241 // Xinef: Only for BG activities
6242 if (!uVictim)
6243 {
6244 uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f));
6245 sScriptMgr->OnGivePlayerXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND);
6246 GiveXP(xp, nullptr);
6247 }
6248 }
6249
6250 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6251 {
6252 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6253 return true;
6254
6255 if (uVictim->IsPlayer())
6256 {
6257 // Check if allowed to receive it in current map
6259 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6260 || (MapType == 2 && !IsFFAPvP())
6261 || (MapType == 3 && !InBattleground()))
6262 return true;
6263
6264 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6265 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6266
6267 if (AddItem(itemID, count))
6268 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6269 }
6270 }
6271
6272 return true;
6273}
@ SCORE_BONUS_HONOR
Definition BattlegroundScore.h:31
@ SPELL_AURA_PLAYER_INACTIVE
Definition Battleground.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition DBCEnums.h:166
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition IWorld.h:335
@ CONFIG_PVP_TOKEN_ID
Definition IWorld.h:336
@ CONFIG_PVP_TOKEN_COUNT
Definition IWorld.h:337
@ CONFIG_PVP_TOKEN_ENABLE
Definition IWorld.h:129
@ RATE_HONOR
Definition IWorld.h:510
@ XPSOURCE_BATTLEGROUND
Definition Player.h:1018
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition SpellAuraDefines.h:344
bool IsRacialLeader() const
Definition Creature.h:73
void Clear()
Definition ObjectGuid.h:138
bool AddItem(uint32 itemId, uint32 count)
Definition Player.cpp:15596
bool IsFFAPvP()
Definition Player.cpp:16256
TeamId GetBgTeamId() const
Definition Player.h:2286
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:5991
bool HasNoPVPCreditAura() const
Definition Unit.h:1724
@ SMSG_PVP_CREDIT
Definition Opcodes.h:682
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition Formulas.h:31
std::unordered_map< std::string, Player * > MapType
Definition ObjectAccessor.cpp:85

References ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, AddItem(), AddPct(), Object::ApplyModUInt32Value(), ObjectGuid::Clear(), CONFIG_PVP_TOKEN_COUNT, CONFIG_PVP_TOKEN_ENABLE, CONFIG_PVP_TOKEN_ID, CONFIG_PVP_TOKEN_MAP_TYPE, WorldObject::GetAreaId(), GetBattleground(), GetBgTeamId(), Unit::getClass(), Acore::XP::GetGrayLevel(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxPositiveAuraModifier(), Unit::getRace(), GetSession(), GetTeamId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasNoPVPCreditAura(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), Object::IsPlayer(), Creature::IsRacialLeader(), ModifyHonorPoints(), PLAYER_CHOSEN_TITLE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, ChatHandler::PSendSysMessage(), RATE_HONOR, SCORE_BONUS_HONOR, WorldSession::SendPacket(), SMSG_PVP_CREDIT, SPELL_AURA_MOD_HONOR_GAIN_PCT, SPELL_AURA_PLAYER_INACTIVE, sScriptMgr, sWorld, Object::ToCreature(), Object::ToPlayer(), UpdateAchievementCriteria(), UpdateHonorFields(), and XPSOURCE_BATTLEGROUND.

Referenced by KillRewarder::_RewardHonor(), DuelComplete(), Spell::EffectAddHonor(), OutdoorPvPSI::HandleAreaTrigger(), honor_commandscript::HandleHonorAddCommand(), honor_commandscript::HandleHonorAddKillCommand(), RewardQuest(), and Battleground::UpdatePlayerScore().

◆ RewardPlayerAndGroupAtEvent()

void Player::RewardPlayerAndGroupAtEvent ( uint32  creature_id,
WorldObject pRewardSource 
)
12775{
12776 if (!pRewardSource)
12777 return;
12778
12779 ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12780
12781 // prepare data for near group iteration
12782 if (Group* group = GetGroup())
12783 {
12784 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12785 {
12786 Player* player = itr->GetSource();
12787 if (!player)
12788 continue;
12789
12790 if (!player->IsAtGroupRewardDistance(pRewardSource))
12791 continue; // member (alive or dead) or his corpse at req. distance
12792
12793 // quest objectives updated only for alive group member or dead but with not released body
12794 if (player->IsAlive() || !player->GetCorpse())
12795 player->KilledMonsterCredit(creature_id, creature_guid);
12796 }
12797 }
12798 else // if (!group)
12799 KilledMonsterCredit(creature_id, creature_guid);
12800}
GroupReference * next()
Definition GroupReference.h:36

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Unit::IsAlive(), IsAtGroupRewardDistance(), Object::IsCreature(), KilledMonsterCredit(), and GroupReference::next().

Referenced by Spell::EffectKillCredit(), spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12770{
12771 KillRewarder(this, victim, isBattleGround).Reward();
12772}
Definition KillRewarder.h:28
void Reward()
Definition KillRewarder.cpp:268

References KillRewarder::Reward().

Referenced by Unit::Kill(), and Battleground::RewardXPAtKill().

◆ RewardQuest()

void Player::RewardQuest ( Quest const *  quest,
uint32  reward,
Object questGiver,
bool  announce = true,
bool  isLFGReward = false 
)
660{
661 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
662 //should work fine, cause far teleport will be executed in Player::Update()
664
665 uint32 quest_id = quest->GetQuestId();
666
667 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
668 {
669 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
670 {
671 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
672 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
673 else
674 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
675 }
676 }
677 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
678 {
679 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
680 {
681 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
682 DestroyItemCount(quest->ItemDrop[i], 9999, true);
683 else
684 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
685 }
686 }
687
688 RemoveTimedQuest(quest_id);
689
690 std::vector<std::pair<uint32, uint32>> problematicItems;
691
692 if (quest->GetRewChoiceItemsCount())
693 {
694 if (uint32 itemId = quest->RewardChoiceItemId[reward])
695 {
696 ItemPosCountVec dest;
697 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
698 {
699 Item* item = StoreNewItem(dest, itemId, true);
700 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
701
702 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
703 }
704 else
705 {
706 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
707 }
708 }
709 }
710
711 if (quest->GetRewItemsCount())
712 {
713 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
714 {
715 if (uint32 itemId = quest->RewardItemId[i])
716 {
717 ItemPosCountVec dest;
718 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
719 {
720 Item* item = StoreNewItem(dest, itemId, true);
721 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
722
723 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
724 }
725 else
726 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
727 }
728 }
729 }
730
731 // Xinef: send items that couldn't be added properly by mail
732 if (!problematicItems.empty())
733 {
734 SendItemRetrievalMail(problematicItems);
735 }
736
737 RewardReputation(quest);
738
739 uint16 log_slot = FindQuestSlot(quest_id);
740 if (log_slot < MAX_QUEST_LOG_SIZE)
741 SetQuestSlot(log_slot, 0);
742
743 bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest();
744
745 // Not give XP in case already completed once repeatable quest
746 uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest);
747
748 sScriptMgr->OnQuestComputeXP(this, quest, XP);
749 int32 moneyRew = 0;
750 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(this))
751 {
752 moneyRew = quest->GetRewMoneyMaxLevel();
753 }
754 else
755 {
756 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST);
757 GiveXP(XP, nullptr, 1.0f, isLFGReward);
758 }
759
760 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
761 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
762 {
763 moneyRew += rewOrReqMoney;
764 }
765
766 if (moneyRew)
767 {
768 ModifyMoney(moneyRew);
769
770 if (moneyRew > 0)
772 }
773
774 // honor reward
775 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
776 RewardHonor(nullptr, 0, honor);
777
778 // title reward
779 if (quest->GetCharTitleId())
780 {
781 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
782 SetTitle(titleEntry);
783 }
784
785 if (quest->GetBonusTalents())
786 {
787 m_questRewardTalentCount += quest->GetBonusTalents();
789 }
790
791 if (quest->GetRewArenaPoints())
792 ModifyArenaPoints(quest->GetRewArenaPoints());
793
794 // Send reward mail
795 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
796 {
797 //- TODO: Poor design of mail system
798 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
799 if (quest->GetRewMailSenderEntry() != 0)
800 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
801 else
802 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
803 CharacterDatabase.CommitTransaction(trans);
804 }
805
806 if (quest->IsDaily() || quest->IsDFQuest())
807 {
808 SetDailyQuestStatus(quest_id);
809 if (quest->IsDaily())
810 {
813 }
814 }
815 else if (quest->IsWeekly())
816 SetWeeklyQuestStatus(quest_id);
817 else if (quest->IsMonthly())
818 SetMonthlyQuestStatus(quest_id);
819 else if (quest->IsSeasonal())
820 SetSeasonalQuestStatus(quest_id);
821
822 RemoveActiveQuest(quest_id, false);
823 SetRewardedQuest(quest_id);
824
825 if (announce)
826 SendQuestReward(quest, XP);
827
828 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
829 if (quest->GetRewSpellCast() > 0)
830 {
831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
832 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
833 {
834 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
835 creature->CastSpell(this, quest->GetRewSpellCast(), true);
836 }
837 else
838 CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else if (quest->GetRewSpell() > 0)
841 {
842 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
843 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
844 {
845 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
846 creature->CastSpell(this, quest->GetRewSpell(), true);
847 }
848 else
849 CastSpell(this, quest->GetRewSpell(), true);
850 }
851
852 if (quest->GetZoneOrSort() > 0)
856
857 // pussywizard: replaced partial save with full save
858 SaveToDB(false, false);
859
860 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
861 {
864 }
865
866 SendQuestUpdate(quest_id);
867
869
870 //lets remove flag for delayed teleports
872
873 // Xinef: area auras may change on quest completion!
876
877 sScriptMgr->OnPlayerCompleteQuest(this, quest);
878}
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition DBCEnums.h:141
@ MAIL_CHECK_MASK_HAS_BODY
Definition Mail.h:51
PlayerXPSource
Definition Player.h:1013
@ XPSOURCE_QUEST
Definition Player.h:1015
@ XPSOURCE_QUEST_DF
Definition Player.h:1016
@ SPELL_EFFECT_CREATE_ITEM
Definition SharedDefines.h:802
bool IsUnit() const
Definition Object.h:208
bool HasPvPForcingQuest() const
Definition PlayerQuest.cpp:2495
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition PlayerQuest.cpp:2264
uint32 CalculateQuestRewardXP(Quest const *quest)
Definition PlayerQuest.cpp:1402
void SetMonthlyQuestStatus(uint32 quest_id)
Definition Player.cpp:12185
void SetSeasonalQuestStatus(uint32 quest_id)
Definition Player.cpp:12175
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition PlayerQuest.cpp:2357
void SetDailyQuestStatus(uint32 quest_id)
Definition Player.cpp:12127
void RewardReputation(Unit *victim)
Definition Player.cpp:5983
void SetRewardedQuest(uint32 quest_id)
Definition PlayerQuest.cpp:880
void SetWeeklyQuestStatus(uint32 quest_id)
Definition Player.cpp:12169
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition PlayerQuest.cpp:1495
void SetMustDelayTeleport(bool setting)
Definition Player.h:2954
bool IsSelfCast() const
Definition SpellInfo.cpp:1090
bool IsInHostileArea
Definition Player.h:366

References ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CalculateQuestRewardXP(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), GiveXP(), SpellInfo::HasEffect(), Quest::HasFlag(), HasPvPForcingQuest(), HasQuestForItem(), InitTalentForLevel(), Quest::IsDaily(), Quest::IsDFQuest(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, Quest::IsMonthly(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), SpellInfo::IsSelfCast(), Object::IsUnit(), Quest::IsWeekly(), Quest::ItemDrop, Quest::ItemDropQuantity, m_questRewardTalentCount, MAIL_CHECK_MASK_HAS_BODY, MAX_QUEST_LOG_SIZE, ModifyArenaPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, RemoveActiveQuest(), RemoveTimedQuest(), Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, RewardHonor(), Quest::RewardItemId, Quest::RewardItemIdCount, RewardReputation(), SaveToDB(), sCharTitlesStore, SendItemRetrievalMail(), MailDraft::SendMailTo(), SendNewItem(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestUpdate(), SetDailyQuestStatus(), SetMonthlyQuestStatus(), SetMustDelayTeleport(), SetQuestSlot(), SetRewardedQuest(), SetSeasonalQuestStatus(), SetTitle(), SetWeeklyQuestStatus(), sObjectMgr, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), UpdateZoneDependentAuras(), XPSOURCE_QUEST, and XPSOURCE_QUEST_DF.

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
6034{
6035 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
6036 {
6037 if (!quest->RewardFactionId[i])
6038 continue;
6039
6040 float rep = 0.f;
6041
6042 if (quest->RewardFactionValueIdOverride[i])
6043 {
6044 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
6045 }
6046 else
6047 {
6048 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
6049 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
6050 {
6051 uint32 field = std::abs(quest->RewardFactionValueId[i]);
6052 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
6053 }
6054 }
6055
6056 if (rep == 0.f)
6057 continue;
6058
6059 if (quest->IsDaily())
6060 {
6061 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6062 }
6063 else if (quest->IsWeekly())
6064 {
6065 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6066 }
6067 else if (quest->IsMonthly())
6068 {
6069 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6070 }
6071 else if (quest->IsRepeatable())
6072 {
6073 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6074 }
6075 else
6076 {
6077 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6078 }
6079
6080 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
6081 {
6082 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
6083 }
6084 }
6085}
DBCStorage< QuestFactionRewEntry > sQuestFactionRewardStore(QuestFactionRewardfmt)
#define QUEST_REPUTATIONS_COUNT
Definition QuestDef.h:41
@ QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER
Definition QuestDef.h:166
float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
Definition Player.cpp:5903
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition ReputationMgr.h:117
Definition DBCStructure.h:1457

References CalculateReputationGain(), GetQuestLevel(), GetReputationMgr(), Quest::HasSpecialFlag(), Quest::IsDaily(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), ReputationMgr::ModifyReputation(), QUEST_REPUTATIONS_COUNT, QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, sFactionStore, and sQuestFactionRewardStore.

◆ RewardReputation() [2/2]

void Player::RewardReputation ( Unit victim)
5984{
5985 if (!victim || victim->IsPlayer())
5986 return;
5987
5988 if (victim->ToCreature()->IsReputationRewardDisabled())
5989 return;
5990
5991 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5992 if (!Rep)
5993 return;
5994
5995 uint32 ChampioningFaction = 0;
5996
5998 {
5999 // support for: Championing - http://www.wowwiki.com/Championing
6000 Map const* map = GetMap();
6001 if (map->IsNonRaidDungeon())
6002 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
6003 if (dungeon->TargetLevel == 80)
6004 ChampioningFaction = GetChampioningFaction();
6005 }
6006
6007 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
6008
6009 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
6010 {
6011 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
6012
6013 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
6014 if (factionEntry1)
6015 {
6016 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
6017 }
6018 }
6019
6020 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
6021 {
6022 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6023
6024 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6025 if (factionEntry2)
6026 {
6027 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
6028 }
6029 }
6030}
LFGDungeonEntry const * GetLFGDungeon(uint32 mapId, Difficulty difficulty)
Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple ...
Definition DBCStores.cpp:852
TeamId
Definition SharedDefines.h:759
bool IsReputationRewardDisabled() const
Definition Creature.h:363
bool IsNonRaidDungeon() const
Definition Map.h:447
uint32 GetChampioningFaction() const
Definition Player.h:2558
uint32 Entry
Definition CreatureData.h:187
Definition DBCStructure.h:1244
Definition ObjectMgr.h:568
uint32 ReputationMaxCap1
Definition ObjectMgr.h:571
float RepValue1
Definition ObjectMgr.h:572
uint32 RepFaction1
Definition ObjectMgr.h:569
uint32 RepFaction2
Definition ObjectMgr.h:570
bool TeamDependent
Definition ObjectMgr.h:577
float RepValue2
Definition ObjectMgr.h:574
uint32 ReputationMaxCap2
Definition ObjectMgr.h:573

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Map::IsNonRaidDungeon(), Object::IsPlayer(), Creature::IsReputationRewardDisabled(), ReputationMgr::ModifyReputation(), ReputationOnKillEntry::RepFaction1, ReputationOnKillEntry::RepFaction2, REPUTATION_SOURCE_KILL, ReputationOnKillEntry::ReputationMaxCap1, ReputationOnKillEntry::ReputationMaxCap2, ReputationOnKillEntry::RepValue1, ReputationOnKillEntry::RepValue2, sFactionStore, sObjectMgr, TEAM_ALLIANCE, TEAM_HORDE, ReputationOnKillEntry::TeamDependent, and Object::ToCreature().

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6707{
6708 if (!IsGameMaster() && ar)
6709 {
6710 uint8 LevelMin = 0;
6711 uint8 LevelMax = 0;
6712
6713 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6714 if (!mapEntry)
6715 return false;
6716
6717 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6718 {
6719 if (ar->levelMin && GetLevel() < ar->levelMin)
6720 LevelMin = ar->levelMin;
6721 if (ar->levelMax && GetLevel() > ar->levelMax)
6722 LevelMax = ar->levelMax;
6723 }
6724
6725 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6726 {
6728 return false;
6729 }
6730
6731 Player* partyLeader = this;
6732 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6733 {
6734 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6735 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6736 if (leaderGuid != GetGUID())
6737 {
6738 if (tempLeader != nullptr)
6739 {
6740 partyLeader = tempLeader;
6741 }
6742 leaderName = GetGroup()->GetLeaderName();
6743 }
6744 }
6745
6746 //Check all items
6747 std::vector<const ProgressionRequirement*> missingPlayerItems;
6748 std::vector<const ProgressionRequirement*> missingLeaderItems;
6749 for (const ProgressionRequirement* itemRequirement : ar->items)
6750 {
6751 Player* checkPlayer = this;
6752 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6753 if (itemRequirement->checkLeaderOnly)
6754 {
6755 checkPlayer = partyLeader;
6756 missingItems = &missingLeaderItems;
6757 }
6758
6759 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6760 {
6761 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6762 {
6763 missingItems->push_back(itemRequirement);
6764 }
6765 }
6766 }
6767
6768 //Check all achievements
6769 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6770 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6771 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6772 {
6773 Player* checkPlayer = this;
6774 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6775 if (achievementRequirement->checkLeaderOnly)
6776 {
6777 checkPlayer = partyLeader;
6778 missingAchievements = &missingLeaderAchievements;
6779 }
6780
6781 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6782 {
6783 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6784 {
6785 missingAchievements->push_back(achievementRequirement);
6786 }
6787 }
6788 }
6789
6790 //Check all quests
6791 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6792 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6793 for (const ProgressionRequirement* questRequirement : ar->quests)
6794 {
6795 Player* checkPlayer = this;
6796 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6797 if (questRequirement->checkLeaderOnly)
6798 {
6799 checkPlayer = partyLeader;
6800 missingQuests = &missingLeaderQuests;
6801 }
6802
6803 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6804 {
6805 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6806 {
6807 missingQuests->push_back(questRequirement);
6808 }
6809 }
6810 }
6811
6812 //Check if avg ILVL requirement is allowed
6813 bool ilvlRequirementNotMet = false;
6815 {
6816 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6817 if (ar->reqItemLevel > currentIlvl)
6818 {
6819 ilvlRequirementNotMet = true;
6820 }
6821 }
6822
6823 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6824 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6825 if (LevelMin || LevelMax || ilvlRequirementNotMet
6826 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6827 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6828 {
6829 if (!sScriptMgr->NotAvoidSatisfy(partyLeader, ar, target_map, report))
6830 return true;
6831
6832 if (report)
6833 {
6834 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6835
6836 if (requirementPrintMode == 0)
6837 {
6838 //Just print out the requirements are not met
6840 }
6841 else if (requirementPrintMode == 1)
6842 {
6843 //Blizzlike method of printing out the requirements
6844 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6845 {
6846 ChatHandler(GetSession()).PSendSysMessage("{}", missingPlayerQuests[0]->note);
6847 }
6848 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6849 {
6850 ChatHandler(GetSession()).PSendSysMessage("{}", missingLeaderQuests[0]->note);
6851 }
6852 else if (mapDiff->hasErrorMessage)
6853 {
6854 // if (missingAchievement) covered by this case
6855 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6856 }
6857 else if (missingPlayerItems.size())
6858 {
6860 std::string name = sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1;
6861 if (ItemLocale const* il = sObjectMgr->GetItemLocale(missingPlayerItems[0]->id))
6862 {
6863 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6864 }
6866 }
6867 else if (LevelMin)
6868 {
6870 }
6871 else if (ilvlRequirementNotMet)
6872 {
6874 }
6875 }
6876 else
6877 {
6878 bool errorAlreadyPrinted = false;
6879 //Pretty way of printing out requirements
6880 if (missingPlayerQuests.size())
6881 {
6883 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6884 errorAlreadyPrinted = true;
6885 }
6886 if (missingLeaderQuests.size())
6887 {
6889 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6890 errorAlreadyPrinted = true;
6891 }
6892
6893 if (missingPlayerAchievements.size())
6894 {
6896 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6897 errorAlreadyPrinted = true;
6898 }
6899 if (missingLeaderAchievements.size())
6900 {
6902 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6903 errorAlreadyPrinted = true;
6904 }
6905
6906 if (missingPlayerItems.size())
6907 {
6909 PrettyPrintRequirementsItemsList(missingPlayerItems);
6910 errorAlreadyPrinted = true;
6911 }
6912
6913 if (missingLeaderItems.size())
6914 {
6916 PrettyPrintRequirementsItemsList(missingLeaderItems);
6917 errorAlreadyPrinted = true;
6918 }
6919
6920 if (ilvlRequirementNotMet)
6921 {
6923 }
6924
6925 if (LevelMin)
6926 {
6928 }
6929 else if (LevelMax)
6930 {
6932 }
6933 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6934 {
6935 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6936 }
6937 }
6938
6939 //Print the extra string
6941 if (optionalStringID > 0)
6942 {
6943 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6944 }
6945 }
6946 return false;
6947 }
6948 }
6949 return true;
6950}
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition DBCStores.cpp:767
@ DISABLE_TYPE_MAP
Definition DisableMgr.h:29
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition IWorld.h:403
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition IWorld.h:402
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition IWorld.h:165
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition IWorld.h:84
@ LANG_INSTANCE_CLOSED
Definition Language.h:1055
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition Language.h:852
@ LANG_YOU
Definition Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition Language.h:848
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition Language.h:845
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition Language.h:843
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition Language.h:847
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition Language.h:849
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition Language.h:844
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition Language.h:850
@ LANG_LEVEL_MINREQUIRED
Definition Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition Language.h:851
@ TRANSFER_ABORT_DIFFICULTY
Definition Player.h:795
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:159
const char * GetLeaderName() const
Definition Group.cpp:2307
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2292
float GetAverageItemLevelForDF()
Definition Player.cpp:15780
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition PlayerStorage.cpp:6598
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition PlayerStorage.cpp:6668
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition Player.cpp:11754
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition PlayerStorage.cpp:6635
void SendAreaTriggerMessage(std::string_view str)
Definition WorldSession.cpp:205
Definition DBCStructure.h:2221
bool hasErrorMessage
Definition DBCStructure.h:2227

References DungeonProgressionRequirements::achievements, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, CONFIG_INSTANCE_IGNORE_LEVEL, DISABLE_TYPE_MAP, HashMapHolder< T >::Find(), WorldSession::GetAcoreString(), GetAverageItemLevelForDF(), GetDifficulty(), GetDownscaledMapDifficultyData(), GetGroup(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetLeaderName(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), GetQuestRewardStatus(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), MapDifficulty::hasErrorMessage, HasItemCount(), IsGameMaster(), MapEntry::IsRaid(), DungeonProgressionRequirements::items, LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET, LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS, LANG_ACCESS_REQUIREMENT_MAX_LEVEL, LANG_ACCESS_REQUIREMENT_NOT_MET, LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS, LANG_INSTANCE_CLOSED, LANG_LEVEL_MINREQUIRED, LANG_LEVEL_MINREQUIRED_AND_ITEM, LANG_YOU, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, m_session, PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ChatHandler::PSendSysMessage(), DungeonProgressionRequirements::quests, DungeonProgressionRequirements::reqItemLevel, sDisableMgr, WorldSession::SendAreaTriggerMessage(), ChatHandler::SendSysMessage(), SendTransferAborted(), sMapStore, sObjectMgr, sScriptMgr, sWorld, TEAM_NEUTRAL, and TRANSFER_ABORT_DIFFICULTY.

Referenced by Spell::CheckCast(), WorldSession::HandleSetRaidDifficultyOpcode(), and MapMgr::PlayerCannotEnter().

◆ SatisfyQuestClass()

bool Player::SatisfyQuestClass ( Quest const *  qInfo,
bool  msg 
) const
1086{
1087 uint32 reqClass = qInfo->GetRequiredClasses();
1088
1089 if (reqClass == 0)
1090 return true;
1091
1092 if ((reqClass & getClassMask()) == 0)
1093 {
1094 if (msg)
1096
1097 return false;
1098 }
1099
1100 return true;
1101}
@ INVALIDREASON_DONT_HAVE_REQ
Definition QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition PlayerQuest.cpp:2405

References Unit::getClassMask(), Quest::GetRequiredClasses(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestConditions()

bool Player::SatisfyQuestConditions ( Quest const *  qInfo,
bool  msg 
)
1160{
1161 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1162 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1163 {
1164 if (msg)
1166 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1167 return false;
1168 }
1169 return true;
1170}

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, Quest::GetQuestId(), INVALIDREASON_DONT_HAVE_REQ, LOG_DEBUG, sConditionMgr, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestDay()

bool Player::SatisfyQuestDay ( Quest const *  qInfo,
bool  msg 
) const
1269{
1270 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1271 return true;
1272
1273 if (qInfo->IsDFQuest())
1274 {
1275 if (!m_DFQuests.empty())
1276 return false;
1277
1278 return true;
1279 }
1280
1281 bool have_slot = false;
1282 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1283 {
1284 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1285 if (qInfo->GetQuestId() == id)
1286 return false;
1287
1288 if (!id)
1289 have_slot = true;
1290 }
1291
1292 if (!have_slot)
1293 {
1294 if (msg)
1296 return false;
1297 }
1298
1299 return true;
1300}
@ INVALIDREASON_DAILY_QUESTS_REMAINING
Definition QuestDef.h:58

References Quest::GetQuestId(), Object::GetUInt32Value(), INVALIDREASON_DAILY_QUESTS_REMAINING, Quest::IsDaily(), Quest::IsDFQuest(), m_DFQuests, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and SendCanTakeQuestResponse().

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SatisfyQuestExclusiveGroup()

bool Player::SatisfyQuestExclusiveGroup ( Quest const *  qInfo,
bool  msg 
) const
1184{
1185 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1186 if (qInfo->GetExclusiveGroup() <= 0)
1187 return true;
1188
1189 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1190
1191 for (; range.first != range.second; ++range.first)
1192 {
1193 uint32 exclude_Id = range.first->second;
1194
1195 // skip checked quest id, only state of other quests in group is interesting
1196 if (exclude_Id == qInfo->GetQuestId())
1197 continue;
1198
1199 // not allow have daily quest if daily quest from exclusive group already recently completed
1200 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1201 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1202 {
1203 if (msg)
1205
1206 return false;
1207 }
1208
1209 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1210 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && !Nquest->IsSeasonal() && IsQuestRewarded(exclude_Id))) // pussywizard: added !Nquest->IsSeasonal() because seasonal quests are considered rewarded only if finished this year, this is checked above in SatisfyQuestSeasonal
1211 {
1212 if (msg)
1214 return false;
1215 }
1216 }
1217 return true;
1218}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition ObjectMgr.h:1136

References Quest::GetExclusiveGroup(), Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QUEST_STATUS_NONE, SatisfyQuestDay(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestLevel()

bool Player::SatisfyQuestLevel ( Quest const *  qInfo,
bool  msg 
) const
968{
969 if (GetLevel() < qInfo->GetMinLevel())
970 {
971 if (msg)
973 return false;
974 }
975 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
976 {
977 if (msg)
978 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
979 return false;
980 }
981 return true;
982}
@ INVALIDREASON_QUEST_FAILED_LOW_LEVEL
Definition QuestDef.h:49

References Unit::GetLevel(), Quest::GetMaxLevel(), Quest::GetMinLevel(), INVALIDREASON_DONT_HAVE_REQ, INVALIDREASON_QUEST_FAILED_LOW_LEVEL, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), npc_wg_quest_giver::GetDialogStatus(), and GetQuestDialogStatus().

◆ SatisfyQuestLog()

bool Player::SatisfyQuestLog ( bool  msg)
985{
986 // exist free slot
988 return true;
989
990 if (msg)
991 {
993 GetSession()->SendPacket(&data);
994 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
995 }
996 return false;
997}
@ SMSG_QUESTLOG_FULL
Definition Opcodes.h:435

References FindQuestSlot(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, WorldSession::SendPacket(), and SMSG_QUESTLOG_FULL.

Referenced by CanAddQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestMonth()

bool Player::SatisfyQuestMonth ( Quest const *  qInfo,
bool  msg 
) const
1327{
1328 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1329 return true;
1330
1331 // if not found in cooldown list
1332 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1333}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1221{
1222 uint32 nextQuest = qInfo->GetNextQuestInChain();
1223 if (!nextQuest)
1224 return true;
1225
1226 // next quest in chain already started or completed
1227 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1228 {
1229 if (msg)
1231 return false;
1232 }
1233
1234 // check for all quests further up the chain
1235 // only necessary if there are quest chains with more than one quest that can be skipped
1236 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1237 return true;
1238}

References Quest::GetNextQuestInChain(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPrevChain()

bool Player::SatisfyQuestPrevChain ( Quest const *  qInfo,
bool  msg 
) const
1241{
1242 // No previous quest in chain
1243 if (qInfo->prevChainQuests.empty())
1244 return true;
1245
1246 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1247 {
1248 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1249
1250 // If any of the previous quests in chain active, return false
1251 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1252 {
1253 if (msg)
1255 return false;
1256 }
1257
1258 // check for all quests further down the chain
1259 // only necessary if there are quest chains with more than one quest that can be skipped
1260 //if (!SatisfyQuestPrevChain(prevId, msg))
1261 // return false;
1262 }
1263
1264 // No previous quest in chain active
1265 return true;
1266}

References INVALIDREASON_DONT_HAVE_REQ, m_QuestStatus, Quest::prevChainQuests, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPreviousQuest()

bool Player::SatisfyQuestPreviousQuest ( Quest const *  qInfo,
bool  msg 
) const
1000{
1001 // No previous quest (might be first quest in a series)
1002 if (qInfo->prevQuests.empty())
1003 return true;
1004
1005 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1006 {
1007 uint32 prevId = std::abs(*iter);
1008
1009 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1010
1011 if (qPrevInfo)
1012 {
1013 // If any of the positive previous quests completed, return true
1014 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1015 {
1016 // skip one-from-all exclusive group
1017 if (qPrevInfo->GetExclusiveGroup() >= 0)
1018 return true;
1019
1020 // each-from-all exclusive group (< 0)
1021 // can be start if only all quests in prev quest exclusive group completed and rewarded
1022 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1023
1024 for (; range.first != range.second; ++range.first)
1025 {
1026 uint32 exclude_Id = range.first->second;
1027
1028 // skip checked quest id, only state of other quests in group is interesting
1029 if (exclude_Id == prevId)
1030 continue;
1031
1032 // alternative quest from group also must be completed and rewarded(reported)
1033
1034 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1035 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1036 {
1037 if (msg)
1039 return false;
1040 }
1041 }
1042 return true;
1043 }
1044
1045 // If any of the negative previous quests active, return true
1046 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1047 {
1048 // skip one-from-all exclusive group
1049 if (qPrevInfo->GetExclusiveGroup() >= 0)
1050 return true;
1051
1052 // each-from-all exclusive group (< 0)
1053 // can be start if only all quests in prev quest exclusive group active
1054 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1055
1056 for (; range.first != range.second; ++range.first)
1057 {
1058 uint32 exclude_Id = range.first->second;
1059
1060 // skip checked quest id, only state of other quests in group is interesting
1061 if (exclude_Id == prevId)
1062 continue;
1063
1064 // alternative quest from group also must be active
1065 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1066 {
1067 if (msg)
1069 return false;
1070 }
1071 }
1072 return true;
1073 }
1074 }
1075 }
1076
1077 // Has only positive prev. quests in non-rewarded state
1078 // and negative prev. quests in non-active state
1079 if (msg)
1081
1082 return false;
1083}
int32 GetExclusiveGroup() const
Definition QuestDef.h:251

References Quest::GetExclusiveGroup(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsSeasonal(), Quest::prevQuests, QUEST_STATUS_NONE, SatisfyQuestSeasonal(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestRace()

bool Player::SatisfyQuestRace ( Quest const *  qInfo,
bool  msg 
) const
1104{
1105 uint32 reqraces = qInfo->GetAllowableRaces();
1106 if (reqraces == 0)
1107 return true;
1108 if ((reqraces & getRaceMask()) == 0)
1109 {
1110 if (msg)
1112 return false;
1113 }
1114 return true;
1115}
@ INVALIDREASON_QUEST_FAILED_WRONG_RACE
Definition QuestDef.h:50

References Quest::GetAllowableRaces(), Unit::getRaceMask(), INVALIDREASON_QUEST_FAILED_WRONG_RACE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestReputation()

bool Player::SatisfyQuestReputation ( Quest const *  qInfo,
bool  msg 
) const
1118{
1119 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1120 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1121 {
1122 if (msg)
1124 return false;
1125 }
1126
1127 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1128 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1129 {
1130 if (msg)
1132 return false;
1133 }
1134
1135 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1136 // to be able to accept the quest
1137 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1138 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1139 {
1140 if (msg)
1142 return false;
1143 }
1144
1145 return true;
1146}

References Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue2(), GetReputation(), GetReputationMgr(), Quest::GetRequiredMaxRepFaction(), Quest::GetRequiredMaxRepValue(), Quest::GetRequiredMinRepFaction(), Quest::GetRequiredMinRepValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestSeasonal()

bool Player::SatisfyQuestSeasonal ( Quest const *  qInfo,
bool  msg 
) const
1312{
1313 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1314 return true;
1315
1316 // cppcheck-suppress mismatchingContainers
1317 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1318
1319 if (itr == m_seasonalquests.end() || itr->second.empty())
1320 return true;
1321
1322 // if not found in cooldown list
1323 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1324}

References Quest::GetEventIdForQuest(), Quest::GetQuestId(), Quest::IsSeasonal(), and m_seasonalquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), GetQuestRewardStatus(), GetQuestStatus(), SatisfyQuestExclusiveGroup(), and SatisfyQuestPreviousQuest().

◆ SatisfyQuestSkill()

bool Player::SatisfyQuestSkill ( Quest const *  qInfo,
bool  msg 
) const
948{
949 uint32 skill = qInfo->GetRequiredSkill();
950
951 // skip 0 case RequiredSkill
952 if (skill == 0)
953 return true;
954
955 // check skill value
956 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
957 {
958 if (msg)
960
961 return false;
962 }
963
964 return true;
965}

References GetBaseSkillValue(), Quest::GetRequiredSkill(), Quest::GetRequiredSkillValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestStatus()

bool Player::SatisfyQuestStatus ( Quest const *  qInfo,
bool  msg 
) const
1149{
1150 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1151 {
1152 if (msg)
1154 return false;
1155 }
1156 return true;
1157}
@ INVALIDREASON_QUEST_ALREADY_ON
Definition QuestDef.h:53

References Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_QUEST_ALREADY_ON, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestTimed()

bool Player::SatisfyQuestTimed ( Quest const *  qInfo,
bool  msg 
) const
1173{
1174 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1175 {
1176 if (msg)
1178 return false;
1179 }
1180 return true;
1181}
@ INVALIDREASON_QUEST_ONLY_ONE_TIMED
Definition QuestDef.h:52

References Quest::HasSpecialFlag(), INVALIDREASON_QUEST_ONLY_ONE_TIMED, m_timedquests, QUEST_SPECIAL_FLAGS_TIMED, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestWeek()

bool Player::SatisfyQuestWeek ( Quest const *  qInfo,
bool  msg 
) const
1303{
1304 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1305 return true;
1306
1307 // if not found in cooldown list
1308 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1309}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7128{
7130 stmt->SetData(0, GetMoney());
7131 stmt->SetData(1, GetGUID().GetCounter());
7132 trans->Append(stmt);
7133}
@ CHAR_UDP_CHAR_MONEY
Definition CharacterDatabase.h:427

References CHAR_UDP_CHAR_MONEY, CharacterDatabase, Object::GetGUID(), GetMoney(), and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), and SaveInventoryAndGoldToDB().

◆ SaveHealthBeforeDuel()

void Player::SaveHealthBeforeDuel ( )
inline

◆ SaveInventoryAndGoldToDB()

void Player::SaveInventoryAndGoldToDB ( CharacterDatabaseTransaction  trans)
7122{
7123 _SaveInventory(trans);
7124 SaveGoldToDB(trans);
7125}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7127
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7241

References _SaveInventory(), and SaveGoldToDB().

Referenced by WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleMailTakeItem(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSendMail(), WorldSession::HandleWrapItemOpcode(), and RefundItem().

◆ SaveManaBeforeDuel()

void Player::SaveManaBeforeDuel ( )
inline

◆ SavePositionInDB() [1/2]

void Player::SavePositionInDB ( uint32  mapid,
float  x,
float  y,
float  z,
float  o,
uint32  zone,
ObjectGuid  guid 
)
static

◆ SavePositionInDB() [2/2]

void Player::SavePositionInDB ( WorldLocation const &  loc,
uint16  zoneId,
ObjectGuid  guid,
CharacterDatabaseTransaction  trans 
)
static
100{
102
103 stmt->SetData(0, loc.GetPositionX());
104 stmt->SetData(1, loc.GetPositionY());
105 stmt->SetData(2, loc.GetPositionZ());
106 stmt->SetData(3, loc.GetOrientation());
107 stmt->SetData(4, uint16(loc.GetMapId()));
108 stmt->SetData(5, zoneId);
109 stmt->SetData(6, guid.GetCounter());
110
111 CharacterDatabase.ExecuteOrAppend(trans, stmt);
112}

References CHAR_UPD_CHARACTER_POSITION, CharacterDatabase, ObjectGuid::GetCounter(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and PreparedStatementBase::SetData().

◆ SaveRecallPosition()

◆ SaveToDB() [1/2]

void Player::SaveToDB ( bool  create,
bool  logout 
)

◆ SaveToDB() [2/2]

void Player::SaveToDB ( CharacterDatabaseTransaction  trans,
bool  create,
bool  logout 
)
7060{
7061 // delay auto save at any saves (manual, in code, or autosave)
7062 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7063
7064 //lets allow only players in world to be saved
7066 {
7068 return;
7069 }
7070
7071 // pussywizard: full save now, so clear partial additional saves
7074
7075 // first save/honor gain after midnight will also update the player's honor fields
7077
7078 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7080
7081 if (!create)
7082 sScriptMgr->OnPlayerSave(this);
7083
7084 _SaveCharacter(create, trans);
7085
7086 if (m_mailsUpdated) //save mails only when needed
7087 _SaveMail(trans);
7088
7089 _SaveEntryPoint(trans);
7090 _SaveInventory(trans);
7091 _SaveQuestStatus(trans);
7092 _SaveDailyQuestStatus(trans);
7096 _SaveTalents(trans);
7097 _SaveSpells(trans);
7098 _SaveSpellCooldowns(trans, logout);
7099 _SaveActions(trans);
7100 _SaveAuras(trans, logout);
7101 _SaveSkills(trans);
7102 m_achievementMgr->SaveToDB(trans);
7103 m_reputationMgr->SaveToDB(trans);
7104 _SaveEquipmentSets(trans);
7105 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7106 _SaveGlyphs(trans);
7108 _SavePlayerSettings(trans);
7109
7110 // check if stats should only be saved on logout
7111 // save stats can be out of transaction
7113 _SaveStats(trans);
7114
7115 // save pet (hunter pet level and experience and all type pets health/mana).
7116 if (Pet* pet = GetPet())
7117 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7118}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition IWorld.h:70
void SaveToDB(CharacterDatabaseTransaction trans)
Definition AchievementMgr.cpp:561
bool IsBeingTeleportedFar() const
Definition Player.h:2100
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7616
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition Player.cpp:15061
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7521
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7694
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition Player.cpp:14718
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7638
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition Player.cpp:14584
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition Player.cpp:15017
void _SaveMail(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7379
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7454
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition PlayerStorage.cpp:7183
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7582
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition Player.cpp:15907
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition PlayerSettings.cpp:91
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7559
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition Player.cpp:3636
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition Player.cpp:14635
void _SaveStats(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7741
void SaveToDB(CharacterDatabaseTransaction trans)
Definition ReputationMgr.cpp:625
bool isLogingOut() const
Is the user engaged in a log out process?
Definition WorldSession.h:399
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition WorldSession.cpp:952

References _SaveActions(), _SaveAuras(), _SaveCharacter(), _SaveDailyQuestStatus(), _SaveEntryPoint(), _SaveEquipmentSets(), _SaveGlyphs(), _SaveInstanceTimeRestrictions(), _SaveInventory(), _SaveMail(), _SaveMonthlyQuestStatus(), _SavePlayerSettings(), _SaveQuestStatus(), _SaveSeasonalQuestStatus(), _SaveSkills(), _SaveSpellCooldowns(), _SaveSpells(), _SaveStats(), _SaveTalents(), _SaveWeeklyQuestStatus(), CONFIG_INTERVAL_SAVE, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, DELAYED_SAVE_PLAYER, GetPet(), GetSession(), IsBeingTeleportedFar(), WorldSession::isLogingOut(), LOG_DEBUG, m_achievementMgr, m_additionalSaveMask, m_additionalSaveTimer, m_mailsUpdated, WorldObject::m_name, m_nextSave, m_reputationMgr, m_session, outDebugValues(), PET_SAVE_AS_CURRENT, AchievementMgr::SaveToDB(), ReputationMgr::SaveToDB(), WorldSession::SaveTutorialsData(), ScheduleDelayedOperation(), sScriptMgr, sWorld, and UpdateHonorFields().

◆ Say() [1/2]

void Player::Say ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles said message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9376{
9377 std::string _text(text);
9378 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_SAY, language, _text))
9379 {
9380 return;
9381 }
9382
9383 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9384
9385 WorldPacket data;
9386 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9387 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true, false, false, true);
9388}
@ CONFIG_LISTEN_RANGE_SAY
Definition IWorld.h:195
@ CHAT_MSG_SAY
Definition SharedDefines.h:3153
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:264
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition Player.cpp:5695

References ChatHandler::BuildChatPacket(), CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by Unit::HandleDummyAuraProc(), WorldSession::HandleMessagechatOpcode(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and boss_headless_horseman::UpdateAI().

◆ Say() [2/2]

void Player::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9391{
9392 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9393}
Talk
Definition hyjal.cpp:82

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2108 {
2109 if (operation < DELAYED_END)
2110 m_DelayedOperations |= operation;
2111 }
@ DELAYED_END
Definition Player.h:915

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5573{
5574 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5575
5577 data << uint8(state);
5578 /*
5579 state can be 0, 1, 2
5580 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5581 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5582 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5583 */
5584 if (state != 2)
5585 {
5586 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5587 {
5588 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5589 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5590 data << uint32(itr->second.packedData);
5591 else
5592 data << uint32(0);
5593 }
5594 }
5595
5596 GetSession()->SendPacket(&data);
5597 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5598}
@ SMSG_ACTION_BUTTONS
Definition Opcodes.h:327

References ACTIONBUTTON_DELETED, Object::GetGUID(), GetSession(), LOG_DEBUG, m_actionButtons, m_activeSpec, MAX_ACTION_BUTTONS, WorldSession::SendPacket(), SMSG_ACTION_BUTTONS, and Position::ToString().

Referenced by ActivateSpec(), WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and SendInitialActionButtons().

◆ SendAttackSwingBadFacingAttack()

void Player::SendAttackSwingBadFacingAttack ( )
147{
149 GetSession()->SendPacket(&data);
150}
@ SMSG_ATTACKSWING_BADFACING
Definition Opcodes.h:356

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_BADFACING.

Referenced by Update().

◆ SendAttackSwingCancelAttack()

◆ SendAttackSwingCantAttack()

void Player::SendAttackSwingCantAttack ( )
135{
137 GetSession()->SendPacket(&data);
138}
@ SMSG_ATTACKSWING_CANT_ATTACK
Definition Opcodes.h:359

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_CANT_ATTACK.

◆ SendAttackSwingDeadTarget()

void Player::SendAttackSwingDeadTarget ( )
129{
131 GetSession()->SendPacket(&data);
132}
@ SMSG_ATTACKSWING_DEADTARGET
Definition Opcodes.h:358

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_DEADTARGET.

◆ SendAttackSwingNotInRange()

void Player::SendAttackSwingNotInRange ( )
79{
81 GetSession()->SendPacket(&data);
82}
@ SMSG_ATTACKSWING_NOTINRANGE
Definition Opcodes.h:355

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_NOTINRANGE.

Referenced by Update().

◆ SendAutoRepeatCancel()

void Player::SendAutoRepeatCancel ( Unit target)
153{
155 data << target->GetPackGUID(); // may be it's target guid
156 SendMessageToSet(&data, true);
157}
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_CANCEL_AUTO_REPEAT
Definition Opcodes.h:698

References Object::GetPackGUID(), SendMessageToSet(), PackedGuid::size(), and SMSG_CANCEL_AUTO_REPEAT.

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), and Unit::InterruptSpell().

◆ SendBattlefieldWorldStates()

void Player::SendBattlefieldWorldStates ( )

Send misc stuff that needs to be sent on every login, like the battle timers.

8879{
8881 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8882 {
8883 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8884 {
8887 SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
8889
8890 for (uint32 i = 0; i < 2; ++i)
8891 SendUpdateWorldState(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + (wg->GetTimer() / 1000)));
8892 }
8893 }
8894}
const uint32 ClockWorldState[2]
Definition BattlefieldWG.h:40
@ BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE
Definition BattlefieldWG.h:110
@ BATTLEFIELD_WG_WORLD_STATE_ACTIVE
Definition BattlefieldWG.h:107
@ BATTLEFIELD_WG_WORLD_STATE_DEFENDER
Definition BattlefieldWG.h:108
@ BATTLEFIELD_WG_WORLD_STATE_ATTACKER
Definition BattlefieldWG.h:109
@ CONFIG_WINTERGRASP_ENABLE
Definition IWorld.h:322
Definition BattlefieldWG.h:275
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2235

References BATTLEFIELD_BATTLEID_WG, BATTLEFIELD_WG_WORLD_STATE_ACTIVE, BATTLEFIELD_WG_WORLD_STATE_ATTACKER, BATTLEFIELD_WG_WORLD_STATE_DEFENDER, BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, ClockWorldState, CONFIG_WINTERGRASP_ENABLE, GameTime::GetGameTime(), sBattlefieldMgr, SendUpdateWorldState(), and sWorld.

Referenced by SendInitWorldStates().

◆ SendBGWeekendWorldStates()

void Player::SendBGWeekendWorldStates ( )
8864{
8865 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8866 {
8867 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8868 if (bl && bl->HolidayWorldStateId)
8869 {
8872 else
8874 }
8875 }
8876}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition BattlegroundMgr.cpp:896
Definition DBCStructure.h:603
uint32 HolidayWorldStateId
Definition DBCStructure.h:611
uint32 id
Definition DBCStructure.h:604

References BattlemasterListEntry::HolidayWorldStateId, BattlemasterListEntry::id, BattlegroundMgr::IsBGWeekend(), sBattlemasterListStore, and SendUpdateWorldState().

Referenced by SendInitWorldStates().

◆ SendBuyError()

void Player::SendBuyError ( BuyResult  msg,
Creature creature,
uint32  item,
uint32  param 
)
4065{
4066 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4067 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4068 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4069 data << uint32(item);
4070 if (param > 0)
4071 data << uint32(param);
4072 data << uint8(msg);
4073 GetSession()->SendPacket(&data);
4074}
@ SMSG_BUY_FAILED
Definition Opcodes.h:451

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_BUY_FAILED.

Referenced by BuyItemFromVendorSlot(), WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendBuyErrorCommand(), WorldSession::HandlePetitionBuyOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), ProcessCastaction(), ProcessUnlearnAction(), and resetTalents().

◆ SendCanTakeQuestResponse()

◆ SendCinematicStart()

void Player::SendCinematicStart ( uint32  CinematicSequenceId) const
5732{
5734 data << uint32(CinematicSequenceId);
5735 SendDirectMessage(&data);
5736 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5737 {
5738 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5739 }
5740}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition CinematicMgr.h:41
@ SMSG_TRIGGER_CINEMATIC
Definition Opcodes.h:280
Definition DBCStructure.h:712

References _cinematicMgr, sCinematicSequencesStore, SendDirectMessage(), CinematicMgr::SetActiveCinematicCamera(), and SMSG_TRIGGER_CINEMATIC.

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ SendClearCooldown()

void Player::SendClearCooldown ( uint32  spell_id,
Unit target 
)

◆ SendCooldownEvent()

void Player::SendCooldownEvent ( SpellInfo const *  spellInfo,
uint32  itemId = 0,
Spell spell = nullptr,
bool  setCooldown = true 
)
11146{
11147 // start cooldowns at server side, if any
11148 if (setCooldown)
11149 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11150
11151 // Send activate cooldown timer (possible 0) at client side
11152 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11153 data << uint32(spellInfo->Id);
11154 data << GetGUID();
11155 SendDirectMessage(&data);
11156}
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10947
@ SMSG_COOLDOWN_EVENT
Definition Opcodes.h:339

References AddSpellAndCategoryCooldowns(), Object::GetGUID(), SpellInfo::Id, SendDirectMessage(), and SMSG_COOLDOWN_EVENT.

Referenced by Spell::_handle_finish_phase(), Aura::_UnapplyForTarget(), Spell::finish(), Unit::RemoveGameObject(), Unit::SetMinion(), and UpdatePotionCooldown().

◆ SendCorpseReclaimDelay()

void Player::SendCorpseReclaimDelay ( uint32  delay)
13018{
13020 data << uint32(delay);
13021 GetSession()->SendPacket(&data);
13022}
@ SMSG_CORPSE_RECLAIM_DELAY
Definition Opcodes.h:647

References GetSession(), WorldSession::SendPacket(), and SMSG_CORPSE_RECLAIM_DELAY.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ SendDirectMessage()

void Player::SendDirectMessage ( WorldPacket const *  data) const
5727{
5728 m_session->SendPacket(data);
5729}

References m_session, and WorldSession::SendPacket().

Referenced by Guild::_SendBankList(), Group::AddMember(), AddSpellAndCategoryCooldowns(), Creature::AddSpellCooldown(), AddSpellMod(), DoRandomRoll(), DuelComplete(), Spell::EffectBind(), Spell::EffectPlayMusic(), BGQueueRemoveEvent::Execute(), GiveLevel(), Aura::HandleAuraSpecificMods(), debug_commandscript::HandleDebugCooldownCommand(), Guild::HandleInviteMember(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), Unit::Kill(), Pet::learnSpell(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), WorldObject::PlayDirectMusic(), WorldObject::PlayDirectSound(), WorldObject::PlayDistanceSound(), AchievementMgr::RemoveCriteriaProgress(), AchievementMgr::Reset(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), SendCinematicStart(), SendClearCooldown(), Unit::SendComboPoints(), SendCooldownEvent(), AchievementMgr::SendCriteriaUpdate(), SendDurabilityLoss(), WeatherMgr::SendFineWeatherUpdateToPlayer(), ReputationMgr::SendForceReactions(), ReputationMgr::SendInitialReputations(), Map::SendInitSelf(), SendLoot(), SendLootError(), SendLootRelease(), Unit::SendMeleeAttackStart(), SendMessageToSet(), SendMessageToSetInRange(), SendMessageToSetInRange(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), World::SendServerMessage(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendUpdateWorldState(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), ChatHandler::SendWorldTextOptional(), Map::SendZoneDynamicInfo(), SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), SetDisableGravity(), SetFeatherFall(), Creature::SetFeatherFall(), SetHover(), Unit::SetOwnerGUID(), Unit::SetRooted(), SetWaterWalking(), Creature::SetWaterWalking(), StopMirrorTimer(), Pet::unlearnSpell(), Unit::Whisper(), Unit::Whisper(), and Whisper().

◆ SendDuelCountdown()

void Player::SendDuelCountdown ( uint32  counter)
15386{
15388 data << uint32(counter); // seconds
15389 GetSession()->SendPacket(&data);
15390}
@ SMSG_DUEL_COUNTDOWN
Definition Opcodes.h:725

References GetSession(), WorldSession::SendPacket(), and SMSG_DUEL_COUNTDOWN.

Referenced by WorldSession::HandleDuelAcceptedOpcode().

◆ SendDungeonDifficulty()

void Player::SendDungeonDifficulty ( bool  IsInGroup)

◆ SendDurabilityLoss()

void Player::SendDurabilityLoss ( )

◆ SendEnchantmentDurations()

void Player::SendEnchantmentDurations ( )
4727{
4728 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4729 {
4730 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4731 }
4732}

References Object::GetGUID(), GetSession(), m_enchantDuration, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendEquipError()

void Player::SendEquipError ( InventoryResult  msg,
Item pItem,
Item pItem2 = nullptr,
uint32  itemid = 0 
)
4022{
4023 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4025 data << uint8(msg);
4026
4027 if (msg != EQUIP_ERR_OK)
4028 {
4029 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4030 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4031 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4032
4033 switch (msg)
4034 {
4037 {
4038 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4039 data << uint32(proto ? proto->RequiredLevel : 0);
4040 break;
4041 }
4042 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4043 {
4044 data << ObjectGuid::Empty; // item guid
4045 data << uint32(0); // slot
4046 data << ObjectGuid::Empty; // container
4047 break;
4048 }
4052 {
4053 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4054 data << uint32(proto ? proto->ItemLimitCategory : 0);
4055 break;
4056 }
4057 default:
4058 break;
4059 }
4060 }
4061 GetSession()->SendPacket(&data);
4062}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition Item.h:131
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition Item.h:127
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition Item.h:133
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition Opcodes.h:304
uint32 RequiredLevel
Definition ItemTemplate.h:636

References ObjectGuid::Empty, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED, EQUIP_ERR_OK, EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW, Object::GetGUID(), GetSession(), Item::GetTemplate(), ItemTemplate::ItemLimitCategory, LOG_DEBUG, ItemTemplate::RequiredLevel, WorldSession::SendPacket(), SMSG_INVENTORY_CHANGE_FAILURE, and sObjectMgr.

Referenced by _StoreOrEquipNewItem(), AutoStoreLoot(), BuyItemFromVendorSlot(), CanAddQuest(), CanRewardQuest(), CanRewardQuest(), CastItemUseSpell(), Spell::CheckItems(), Group::CountTheRoll(), Spell::DoCreateItem(), Spell::EffectRechargeManaGem(), GiveQuestSourceItem(), WorldSession::HandleAcceptTradeOpcode(), misc_commandscript::HandleAddItemSetCommand(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), AuraEffect::HandleChannelDeathItem(), debug_commandscript::HandleDebugSendEquipErrorCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleReadItem(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSocketOpcode(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), WorldSession::HandleUseItemOpcode(), WorldSession::HandleWrapItemOpcode(), ModifyMoney(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14514{
14515 uint32 count = 0;
14517 std::size_t count_pos = data.wpos();
14518 data << uint32(count); // count placeholder
14519 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14520 {
14521 if (itr->second.state == EQUIPMENT_SET_DELETED)
14522 continue;
14523
14524 data.appendPackGUID(itr->second.Guid);
14525 data << uint32(itr->first);
14526 data << itr->second.Name;
14527 data << itr->second.IconName;
14528 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14529 {
14530 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14531 if (itr->second.IgnoreMask & (1 << i))
14532 data.appendPackGUID(uint64(1));
14533 else // xinef: send proper data (do not append 0 with high guid)
14534 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14535 }
14536
14537 ++count; // client have limit but it checked at loading and set
14538 }
14539 data.put<uint32>(count_pos, count);
14540 GetSession()->SendPacket(&data);
14541}
@ SMSG_EQUIPMENT_SET_LIST
Definition Opcodes.h:1242

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_DELETED, EQUIPMENT_SLOT_END, GetSession(), m_EquipmentSets, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_LIST, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendExplorationExperience()

void Player::SendExplorationExperience ( uint32  Area,
uint32  Experience 
)
160{
162 data << uint32(Area);
163 data << uint32(Experience);
164 GetSession()->SendPacket(&data);
165}
@ SMSG_EXPLORATION_EXPERIENCE
Definition Opcodes.h:534

References GetSession(), WorldSession::SendPacket(), and SMSG_EXPLORATION_EXPERIENCE.

Referenced by CheckAreaExploreAndOutdoor().

◆ SendInitialActionButtons()

void Player::SendInitialActionButtons ( ) const
inline

◆ SendInitialPacketsAfterAddToMap()

void Player::SendInitialPacketsAfterAddToMap ( )
11673{
11675
11678
11679 CastSpell(this, 836, true); // LOGINEFFECT
11680
11681 // set some aura effects that send packet to player client after add player to map
11682 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11683 // same auras state lost at far teleport, send it one more time in this case also
11684 static const AuraType auratypes[] =
11685 {
11689 };
11690 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11691 {
11692 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11693 if (!auraList.empty())
11694 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11695 }
11696
11697 // Fix mount, update block gets messed somewhere
11698 {
11700 {
11701 AddAura(GetMountBlockId(), this);
11702 SetMountBlockId(0);
11703 }
11704 }
11705
11706 // update zone
11707 uint32 newzone, newarea;
11708 GetZoneAndAreaId(newzone, newarea);
11709 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11710
11711 if (HasStunAura())
11713
11714 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11715 if (HasRootAura())
11716 {
11718 data2 << GetPackGUID();
11719 data2 << (uint32)2;
11720 SendMessageToSet(&data2, true);
11721 }
11722
11723 SendEnchantmentDurations(); // must be after add to map
11724 SendItemDurations(); // must be after add to map
11727
11728 // raid downscaling - send difficulty to player
11729 if (GetMap()->IsRaid())
11730 {
11732 {
11735 }
11736 }
11738 SendRaidDifficulty(GetGroup() != nullptr);
11739}
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168
@ SPELL_AURA_FLY
Definition SpellAuraDefines.h:264
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition PlayerUpdates.cpp:1584
uint32 GetMountBlockId()
Definition Player.h:2612
void SendTaxiNodeStatusMultiple()
Definition Player.cpp:10543
Difficulty GetStoredRaidDifficulty() const
Definition Player.h:1930
void SendEnchantmentDurations()
Definition PlayerStorage.cpp:4726
void SendItemDurations()
Definition PlayerStorage.cpp:4742
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition PlayerMisc.cpp:177
bool HasStunAura() const
Definition Unit.h:1753
bool HasMountedAura() const
Definition Unit.h:1713
bool HasRootAura() const
Definition Unit.h:1752
void SendTimeSync()
Definition WorldSession.cpp:1635
void ResetTimeSync()
Definition WorldSession.cpp:1629
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetMountBlockId(), Object::GetPackGUID(), GetRaidDifficulty(), GetSession(), GetStoredRaidDifficulty(), WorldObject::GetZoneAndAreaId(), Unit::HasMountedAura(), Unit::HasRootAura(), Unit::HasStunAura(), isBeingLoaded(), MOVE_ROOT, WorldSession::ResetTimeSync(), SendEnchantmentDurations(), SendItemDurations(), SendMessageToSet(), SendQuestGiverStatusMultiple(), SendRaidDifficulty(), SendTaxiNodeStatusMultiple(), WorldSession::SendTimeSync(), SetMountBlockId(), SetMovement(), SMSG_FORCE_MOVE_ROOT, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_NONE, SPELL_AURA_SAFE_FALL, SPELL_AURA_TRANSFORM, SPELL_AURA_WATER_WALK, StoreRaidMapDifficulty(), UpdateVisibilityForPlayer(), and UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialPacketsBeforeAddToMap()

void Player::SendInitialPacketsBeforeAddToMap ( )

Pass 'this' as argument because we're not stored in ObjectAccessor yet

11616{
11619
11620 // guild bank list?
11621
11622 // Homebind
11623 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11624 data << m_homebindX << m_homebindY << m_homebindZ;
11625 data << (uint32) m_homebindMapId;
11626 data << (uint32) m_homebindAreaId;
11627 GetSession()->SendPacket(&data);
11628
11629 // SMSG_SET_PROFICIENCY
11630 // SMSG_SET_PCT_SPELL_MODIFIER
11631 // SMSG_SET_FLAT_SPELL_MODIFIER
11632 // SMSG_UPDATE_AURA_DURATION
11633
11634 SendTalentsInfoData(false);
11635
11636 // SMSG_INSTANCE_DIFFICULTY
11637 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11638 data << uint32(GetMap()->GetDifficulty());
11639 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11640 GetSession()->SendPacket(&data);
11641
11643
11644 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11645 data << uint32(0); // count, for (count) uint32;
11646 GetSession()->SendPacket(&data);
11647
11651
11653
11654 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11655 data.AppendPackedTime(GameTime::GetGameTime().count());
11656 data << float(0.01666667f); // game speed
11657 data << uint32(0); // added in 3.1.2
11658 GetSession()->SendPacket(&data);
11659
11660 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11661
11662 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11663 // SMSG_PET_GUIDS
11664 // SMSG_UPDATE_WORLD_STATE
11665 // SMSG_POWER_UPDATE
11666
11667 SetMover(this);
11668
11669 sScriptMgr->OnSendInitialPacketsBeforeAddToMap(this, data);
11670}
void SendAllAchievementData() const
Definition AchievementMgr.cpp:2382
void SendSocialList(Player *player, uint32 flags)
Definition SocialMgr.cpp:124
void SendInitialSpells()
Definition Player.cpp:2771
PlayerSocial * GetSocial()
Definition Player.h:1158
void SendInitialActionButtons() const
Definition Player.h:1850
void SendEquipmentSetList()
Definition Player.cpp:14513
void SetMover(Unit *target)
Definition Player.cpp:12936
void SendInitialReputations()
Definition ReputationMgr.cpp:211
void SendForceReactions()
Definition ReputationMgr.cpp:165
@ SMSG_INSTANCE_DIFFICULTY
Definition Opcodes.h:857
@ SMSG_BINDPOINTUPDATE
Definition Opcodes.h:371
@ SMSG_LOGIN_SETTIMESPEED
Definition Opcodes.h:96
@ SMSG_SEND_UNLEARN_SPELLS
Definition Opcodes.h:1084

References ByteBuffer::AppendPackedTime(), GetDifficulty(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMap(), GetReputationMgr(), GetSession(), GetSocial(), WorldPacket::Initialize(), m_achievementMgr, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_reputationMgr, AchievementMgr::SendAllAchievementData(), SendEquipmentSetList(), ReputationMgr::SendForceReactions(), SendInitialActionButtons(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), WorldSession::SendPacket(), PlayerSocial::SendSocialList(), SendTalentsInfoData(), SetMover(), SMSG_BINDPOINTUPDATE, SMSG_INSTANCE_DIFFICULTY, SMSG_LOGIN_SETTIMESPEED, SMSG_SEND_UNLEARN_SPELLS, SOCIAL_FLAG_ALL, and sScriptMgr.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialSpells()

void Player::SendInitialSpells ( )
2772{
2773 uint32 curTime = GameTime::GetGameTimeMS().count();
2775
2776 uint16 spellCount = 0;
2777
2778 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2779 data << uint8(0);
2780
2781 std::size_t countPos = data.wpos();
2782 data << uint16(spellCount); // spell count placeholder
2783
2784 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2785 {
2786 if (itr->second->State == PLAYERSPELL_REMOVED)
2787 continue;
2788
2789 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2790 continue;
2791
2792 data << uint32(itr->first);
2793 data << uint16(0); // it's not slot id
2794
2795 ++spellCount;
2796 }
2797
2798 // Added spells from glyphs too (needed by spell tooltips)
2799 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2800 {
2801 if (uint32 glyph = GetGlyph(i))
2802 {
2803 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2804 {
2805 data << uint32(glyphEntry->SpellId);
2806 data << uint16(0); // it's not slot id
2807
2808 ++spellCount;
2809 }
2810 }
2811 }
2812
2813 // xinef: we have to send talents, but not those on m_spells list
2814 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2815 {
2816 if (itr->second->State == PLAYERSPELL_REMOVED)
2817 continue;
2818
2819 // xinef: remove all active talent auras
2820 if (!(itr->second->specMask & GetActiveSpecMask()))
2821 continue;
2822
2823 // xinef: already sent from m_spells
2824 if (itr->second->inSpellBook)
2825 continue;
2826
2827 data << uint32(itr->first);
2828 data << uint16(0); // it's not slot id
2829
2830 ++spellCount;
2831 }
2832
2833 data.put<uint16>(countPos, spellCount); // write real count value
2834
2835 uint16 spellCooldowns = m_spellCooldowns.size();
2836 data << uint16(spellCooldowns);
2837 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2838 {
2839 if (!itr->second.needSendToClient)
2840 continue;
2841
2842 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2843 if (!sEntry)
2844 continue;
2845
2846 data << uint32(itr->first);
2847
2848 data << uint16(itr->second.itemid); // cast item id
2849 data << uint16(itr->second.category); // spell category
2850
2851 // send infinity cooldown in special format
2852 if (itr->second.end >= infTime)
2853 {
2854 data << uint32(1); // cooldown
2855 data << uint32(0x80000000); // category cooldown
2856 continue;
2857 }
2858
2859 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2860 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2861 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2862 }
2863
2864 GetSession()->SendPacket(&data);
2865}
@ SMSG_INITIAL_SPELLS
Definition Opcodes.h:328

References GetActiveSpec(), GetActiveSpecMask(), GameTime::GetGameTimeMS(), GetGlyph(), GetSession(), infinityCooldownDelayCheck, m_spellCooldowns, m_spells, m_talents, MAX_GLYPH_SLOT_INDEX, PLAYERSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), sGlyphPropertiesStore, SMSG_INITIAL_SPELLS, sSpellMgr, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendInitWorldStates()

void Player::SendInitWorldStates ( uint32  zone,
uint32  area 
)
8223{
8224 // data depends on zoneid/mapid...
8226 uint32 mapid = GetMapId();
8227 OutdoorPvP* pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
8228 InstanceScript* instance = GetInstanceScript();
8229 Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(zoneid);
8230
8231 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapid, zoneid);
8232
8233 WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (12 * 8)));
8234 data << uint32(mapid); // mapid
8235 data << uint32(zoneid); // zone id
8236 data << uint32(areaid); // area id, new 2.1.0
8237 std::size_t countPos = data.wpos();
8238 data << uint16(0); // count of uint64 blocks
8239 data << uint32(0x8d8) << uint32(0x0); // 1
8240 data << uint32(0x8d7) << uint32(0x0); // 2
8241 data << uint32(0x8d6) << uint32(0x0); // 3
8242 data << uint32(0x8d5) << uint32(0x0); // 4
8243 data << uint32(0x8d4) << uint32(0x0); // 5
8244 data << uint32(0x8d3) << uint32(0x0); // 6
8245 // 7 1 - Arena season in progress, 0 - end of season
8246 data << uint32(0xC77) << uint32(sWorld->getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS));
8247 // 8 Arena season id
8248 data << uint32(0xF3D) << uint32(sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID));
8249
8250 if (mapid == 530) // Outland
8251 {
8252 data << uint32(0x9bf) << uint32(0x0); // 7
8253 data << uint32(0x9bd) << uint32(0xF); // 8
8254 data << uint32(0x9bb) << uint32(0xF); // 9
8255 }
8256
8258 {
8259 Player::bgZoneIdToFillWorldStates[zoneid](bg, data);
8260 }
8261 else
8262 {
8263 // insert <field> <value>
8264 switch (zoneid)
8265 {
8266 case 1: // Dun Morogh
8267 case 11: // Wetlands
8268 case 12: // Elwynn Forest
8269 case 38: // Loch Modan
8270 case 40: // Westfall
8271 case 51: // Searing Gorge
8272 case 1519: // Stormwind City
8273 case 1537: // Ironforge
8274 case 2257: // Deeprun Tram
8275 case 3703: // Shattrath City
8276 break;
8277 case 139: // Eastern Plaguelands
8278 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP)
8279 pvp->FillInitialWorldStates(data);
8280 else
8281 {
8282 data << uint32(0x97a) << uint32(0x0); // 10 2426
8283 data << uint32(0x917) << uint32(0x0); // 11 2327
8284 data << uint32(0x918) << uint32(0x0); // 12 2328
8285 data << uint32(0x97b) << uint32(0x32); // 13 2427
8286 data << uint32(0x97c) << uint32(0x32); // 14 2428
8287 data << uint32(0x933) << uint32(0x1); // 15 2355
8288 data << uint32(0x946) << uint32(0x0); // 16 2374
8289 data << uint32(0x947) << uint32(0x0); // 17 2375
8290 data << uint32(0x948) << uint32(0x0); // 18 2376
8291 data << uint32(0x949) << uint32(0x0); // 19 2377
8292 data << uint32(0x94a) << uint32(0x0); // 20 2378
8293 data << uint32(0x94b) << uint32(0x0); // 21 2379
8294 data << uint32(0x932) << uint32(0x0); // 22 2354
8295 data << uint32(0x934) << uint32(0x0); // 23 2356
8296 data << uint32(0x935) << uint32(0x0); // 24 2357
8297 data << uint32(0x936) << uint32(0x0); // 25 2358
8298 data << uint32(0x937) << uint32(0x0); // 26 2359
8299 data << uint32(0x938) << uint32(0x0); // 27 2360
8300 data << uint32(0x939) << uint32(0x1); // 28 2361
8301 data << uint32(0x930) << uint32(0x1); // 29 2352
8302 data << uint32(0x93a) << uint32(0x0); // 30 2362
8303 data << uint32(0x93b) << uint32(0x0); // 31 2363
8304 data << uint32(0x93c) << uint32(0x0); // 32 2364
8305 data << uint32(0x93d) << uint32(0x0); // 33 2365
8306 data << uint32(0x944) << uint32(0x0); // 34 2372
8307 data << uint32(0x945) << uint32(0x0); // 35 2373
8308 data << uint32(0x931) << uint32(0x1); // 36 2353
8309 data << uint32(0x93e) << uint32(0x0); // 37 2366
8310 data << uint32(0x931) << uint32(0x1); // 38 2367 ?? grey horde not in dbc! send for consistency's sake, and to match field count
8311 data << uint32(0x940) << uint32(0x0); // 39 2368
8312 data << uint32(0x941) << uint32(0x0); // 7 2369
8313 data << uint32(0x942) << uint32(0x0); // 8 2370
8314 data << uint32(0x943) << uint32(0x0); // 9 2371
8315 }
8316 break;
8317 case 1377: // Silithus
8318 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_SI)
8319 pvp->FillInitialWorldStates(data);
8320 else
8321 {
8322 // states are always shown
8323 data << uint32(2313) << uint32(0x0); // 7 ally silityst gathered
8324 data << uint32(2314) << uint32(0x0); // 8 horde silityst gathered
8325 data << uint32(2317) << uint32(0x0); // 9 max silithyst
8326 }
8327 // dunno about these... aq opening event maybe?
8328 data << uint32(2322) << uint32(0x0); // 10 sandworm N
8329 data << uint32(2323) << uint32(0x0); // 11 sandworm S
8330 data << uint32(2324) << uint32(0x0); // 12 sandworm SW
8331 data << uint32(2325) << uint32(0x0); // 13 sandworm E
8332 break;
8333 case 2597: // Alterac Valley
8334 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV)
8335 bg->FillInitialWorldStates(data);
8336 else
8337 {
8338 data << uint32(0x7ae) << uint32(0x1); // 7 snowfall n
8339 data << uint32(0x532) << uint32(0x1); // 8 frostwolfhut hc
8340 data << uint32(0x531) << uint32(0x0); // 9 frostwolfhut ac
8341 data << uint32(0x52e) << uint32(0x0); // 10 stormpike firstaid a_a
8342 data << uint32(0x571) << uint32(0x0); // 11 east frostwolf tower horde assaulted -unused
8343 data << uint32(0x570) << uint32(0x0); // 12 west frostwolf tower horde assaulted - unused
8344 data << uint32(0x567) << uint32(0x1); // 13 frostwolfe c
8345 data << uint32(0x566) << uint32(0x1); // 14 frostwolfw c
8346 data << uint32(0x550) << uint32(0x1); // 15 irondeep (N) ally
8347 data << uint32(0x544) << uint32(0x0); // 16 ice grave a_a
8348 data << uint32(0x536) << uint32(0x0); // 17 stormpike grave h_c
8349 data << uint32(0x535) << uint32(0x1); // 18 stormpike grave a_c
8350 data << uint32(0x518) << uint32(0x0); // 19 stoneheart grave a_a
8351 data << uint32(0x517) << uint32(0x0); // 20 stoneheart grave h_a
8352 data << uint32(0x574) << uint32(0x0); // 21 1396 unk
8353 data << uint32(0x573) << uint32(0x0); // 22 iceblood tower horde assaulted -unused
8354 data << uint32(0x572) << uint32(0x0); // 23 towerpoint horde assaulted - unused
8355 data << uint32(0x56f) << uint32(0x0); // 24 1391 unk
8356 data << uint32(0x56e) << uint32(0x0); // 25 iceblood a
8357 data << uint32(0x56d) << uint32(0x0); // 26 towerp a
8358 data << uint32(0x56c) << uint32(0x0); // 27 frostwolfe a
8359 data << uint32(0x56b) << uint32(0x0); // 28 froswolfw a
8360 data << uint32(0x56a) << uint32(0x1); // 29 1386 unk
8361 data << uint32(0x569) << uint32(0x1); // 30 iceblood c
8362 data << uint32(0x568) << uint32(0x1); // 31 towerp c
8363 data << uint32(0x565) << uint32(0x0); // 32 stoneh tower a
8364 data << uint32(0x564) << uint32(0x0); // 33 icewing tower a
8365 data << uint32(0x563) << uint32(0x0); // 34 dunn a
8366 data << uint32(0x562) << uint32(0x0); // 35 duns a
8367 data << uint32(0x561) << uint32(0x0); // 36 stoneheart bunker alliance assaulted - unused
8368 data << uint32(0x560) << uint32(0x0); // 37 icewing bunker alliance assaulted - unused
8369 data << uint32(0x55f) << uint32(0x0); // 38 dunbaldar south alliance assaulted - unused
8370 data << uint32(0x55e) << uint32(0x0); // 39 dunbaldar north alliance assaulted - unused
8371 data << uint32(0x55d) << uint32(0x0); // 40 stone tower d
8372 data << uint32(0x3c6) << uint32(0x0); // 41 966 unk
8373 data << uint32(0x3c4) << uint32(0x0); // 42 964 unk
8374 data << uint32(0x3c2) << uint32(0x0); // 43 962 unk
8375 data << uint32(0x516) << uint32(0x1); // 44 stoneheart grave a_c
8376 data << uint32(0x515) << uint32(0x0); // 45 stonheart grave h_c
8377 data << uint32(0x3b6) << uint32(0x0); // 46 950 unk
8378 data << uint32(0x55c) << uint32(0x0); // 47 icewing tower d
8379 data << uint32(0x55b) << uint32(0x0); // 48 dunn d
8380 data << uint32(0x55a) << uint32(0x0); // 49 duns d
8381 data << uint32(0x559) << uint32(0x0); // 50 1369 unk
8382 data << uint32(0x558) << uint32(0x0); // 51 iceblood d
8383 data << uint32(0x557) << uint32(0x0); // 52 towerp d
8384 data << uint32(0x556) << uint32(0x0); // 53 frostwolfe d
8385 data << uint32(0x555) << uint32(0x0); // 54 frostwolfw d
8386 data << uint32(0x554) << uint32(0x1); // 55 stoneh tower c
8387 data << uint32(0x553) << uint32(0x1); // 56 icewing tower c
8388 data << uint32(0x552) << uint32(0x1); // 57 dunn c
8389 data << uint32(0x551) << uint32(0x1); // 58 duns c
8390 data << uint32(0x54f) << uint32(0x0); // 59 irondeep (N) horde
8391 data << uint32(0x54e) << uint32(0x0); // 60 irondeep (N) ally
8392 data << uint32(0x54d) << uint32(0x1); // 61 mine (S) neutral
8393 data << uint32(0x54c) << uint32(0x0); // 62 mine (S) horde
8394 data << uint32(0x54b) << uint32(0x0); // 63 mine (S) ally
8395 data << uint32(0x545) << uint32(0x0); // 64 iceblood h_a
8396 data << uint32(0x543) << uint32(0x1); // 65 iceblod h_c
8397 data << uint32(0x542) << uint32(0x0); // 66 iceblood a_c
8398 data << uint32(0x540) << uint32(0x0); // 67 snowfall h_a
8399 data << uint32(0x53f) << uint32(0x0); // 68 snowfall a_a
8400 data << uint32(0x53e) << uint32(0x0); // 69 snowfall h_c
8401 data << uint32(0x53d) << uint32(0x0); // 70 snowfall a_c
8402 data << uint32(0x53c) << uint32(0x0); // 71 frostwolf g h_a
8403 data << uint32(0x53b) << uint32(0x0); // 72 frostwolf g a_a
8404 data << uint32(0x53a) << uint32(0x1); // 73 frostwolf g h_c
8405 data << uint32(0x539) << uint32(0x0); // 74 frostwolf g a_c
8406 data << uint32(0x538) << uint32(0x0); // 75 stormpike grave h_a
8407 data << uint32(0x537) << uint32(0x0); // 76 stormpike grave a_a
8408 data << uint32(0x534) << uint32(0x0); // 77 frostwolf hut h_a
8409 data << uint32(0x533) << uint32(0x0); // 78 frostwolf hut a_a
8410 data << uint32(0x530) << uint32(0x0); // 79 stormpike first aid h_a
8411 data << uint32(0x52f) << uint32(0x0); // 80 stormpike first aid h_c
8412 data << uint32(0x52d) << uint32(0x1); // 81 stormpike first aid a_c
8413 }
8414 break;
8415 case 3277: // Warsong Gulch
8416 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS)
8417 bg->FillInitialWorldStates(data);
8418 else
8419 {
8420 data << uint32(0x62d) << uint32(0x0); // 7 1581 alliance flag captures
8421 data << uint32(0x62e) << uint32(0x0); // 8 1582 horde flag captures
8422 data << uint32(0x609) << uint32(0x0); // 9 1545 unk, set to 1 on alliance flag pickup...
8423 data << uint32(0x60a) << uint32(0x0); // 10 1546 unk, set to 1 on horde flag pickup, after drop it's -1
8424 data << uint32(0x60b) << uint32(0x2); // 11 1547 unk
8425 data << uint32(0x641) << uint32(0x3); // 12 1601 unk (max flag captures?)
8426 data << uint32(0x922) << uint32(0x1); // 13 2338 horde (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8427 data << uint32(0x923) << uint32(0x1); // 14 2339 alliance (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8428 }
8429 break;
8430 case 3358: // Arathi Basin
8431 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB)
8432 bg->FillInitialWorldStates(data);
8433 else
8434 {
8435 data << uint32(0x6e7) << uint32(0x0); // 7 1767 stables alliance
8436 data << uint32(0x6e8) << uint32(0x0); // 8 1768 stables horde
8437 data << uint32(0x6e9) << uint32(0x0); // 9 1769 unk, ST?
8438 data << uint32(0x6ea) << uint32(0x0); // 10 1770 stables (show/hide)
8439 data << uint32(0x6ec) << uint32(0x0); // 11 1772 farm (0 - horde controlled, 1 - alliance controlled)
8440 data << uint32(0x6ed) << uint32(0x0); // 12 1773 farm (show/hide)
8441 data << uint32(0x6ee) << uint32(0x0); // 13 1774 farm color
8442 data << uint32(0x6ef) << uint32(0x0); // 14 1775 gold mine color, may be FM?
8443 data << uint32(0x6f0) << uint32(0x0); // 15 1776 alliance resources
8444 data << uint32(0x6f1) << uint32(0x0); // 16 1777 horde resources
8445 data << uint32(0x6f2) << uint32(0x0); // 17 1778 horde bases
8446 data << uint32(0x6f3) << uint32(0x0); // 18 1779 alliance bases
8447 data << uint32(0x6f4) << uint32(0x640); // 19 1780 max resources (1600)
8448 data << uint32(0x6f6) << uint32(0x0); // 20 1782 blacksmith color
8449 data << uint32(0x6f7) << uint32(0x0); // 21 1783 blacksmith (show/hide)
8450 data << uint32(0x6f8) << uint32(0x0); // 22 1784 unk, bs?
8451 data << uint32(0x6f9) << uint32(0x0); // 23 1785 unk, bs?
8452 data << uint32(0x6fb) << uint32(0x0); // 24 1787 gold mine (0 - horde contr, 1 - alliance contr)
8453 data << uint32(0x6fc) << uint32(0x0); // 25 1788 gold mine (0 - conflict, 1 - horde)
8454 data << uint32(0x6fd) << uint32(0x0); // 26 1789 gold mine (1 - show/0 - hide)
8455 data << uint32(0x6fe) << uint32(0x0); // 27 1790 gold mine color
8456 data << uint32(0x700) << uint32(0x0); // 28 1792 gold mine color, may be LM?
8457 data << uint32(0x701) << uint32(0x0); // 29 1793 lumber mill color (0 - conflict, 1 - horde contr)
8458 data << uint32(0x702) << uint32(0x0); // 30 1794 lumber mill (show/hide)
8459 data << uint32(0x703) << uint32(0x0); // 31 1795 lumber mill color color
8460 data << uint32(0x732) << uint32(0x1); // 32 1842 stables (1 - uncontrolled)
8461 data << uint32(0x733) << uint32(0x1); // 33 1843 gold mine (1 - uncontrolled)
8462 data << uint32(0x734) << uint32(0x1); // 34 1844 lumber mill (1 - uncontrolled)
8463 data << uint32(0x735) << uint32(0x1); // 35 1845 farm (1 - uncontrolled)
8464 data << uint32(0x736) << uint32(0x1); // 36 1846 blacksmith (1 - uncontrolled)
8465 data << uint32(0x745) << uint32(0x2); // 37 1861 unk
8466 data << uint32(0x7a3) << uint32(0x578); // 38 1955 warning limit (1400)
8467 }
8468 break;
8469 case 3820: // Eye of the Storm
8470 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_EY)
8471 bg->FillInitialWorldStates(data);
8472 else
8473 {
8474 data << uint32(0xac1) << uint32(0x0); // 7 2753 Horde Bases
8475 data << uint32(0xac0) << uint32(0x0); // 8 2752 Alliance Bases
8476 data << uint32(0xab6) << uint32(0x0); // 9 2742 Mage Tower - Horde conflict
8477 data << uint32(0xab5) << uint32(0x0); // 10 2741 Mage Tower - Alliance conflict
8478 data << uint32(0xab4) << uint32(0x0); // 11 2740 Fel Reaver - Horde conflict
8479 data << uint32(0xab3) << uint32(0x0); // 12 2739 Fel Reaver - Alliance conflict
8480 data << uint32(0xab2) << uint32(0x0); // 13 2738 Draenei - Alliance conflict
8481 data << uint32(0xab1) << uint32(0x0); // 14 2737 Draenei - Horde conflict
8482 data << uint32(0xab0) << uint32(0x0); // 15 2736 unk // 0 at start
8483 data << uint32(0xaaf) << uint32(0x0); // 16 2735 unk // 0 at start
8484 data << uint32(0xaad) << uint32(0x0); // 17 2733 Draenei - Horde control
8485 data << uint32(0xaac) << uint32(0x0); // 18 2732 Draenei - Alliance control
8486 data << uint32(0xaab) << uint32(0x1); // 19 2731 Draenei uncontrolled (1 - yes, 0 - no)
8487 data << uint32(0xaaa) << uint32(0x0); // 20 2730 Mage Tower - Alliance control
8488 data << uint32(0xaa9) << uint32(0x0); // 21 2729 Mage Tower - Horde control
8489 data << uint32(0xaa8) << uint32(0x1); // 22 2728 Mage Tower uncontrolled (1 - yes, 0 - no)
8490 data << uint32(0xaa7) << uint32(0x0); // 23 2727 Fel Reaver - Horde control
8491 data << uint32(0xaa6) << uint32(0x0); // 24 2726 Fel Reaver - Alliance control
8492 data << uint32(0xaa5) << uint32(0x1); // 25 2725 Fel Reaver uncontrolled (1 - yes, 0 - no)
8493 data << uint32(0xaa4) << uint32(0x0); // 26 2724 Boold Elf - Horde control
8494 data << uint32(0xaa3) << uint32(0x0); // 27 2723 Boold Elf - Alliance control
8495 data << uint32(0xaa2) << uint32(0x1); // 28 2722 Boold Elf uncontrolled (1 - yes, 0 - no)
8496 data << uint32(0xac5) << uint32(0x1); // 29 2757 Flag (1 - show, 0 - hide) - doesn't work exactly this way!
8497 data << uint32(0xad2) << uint32(0x1); // 30 2770 Horde top-stats (1 - show, 0 - hide) // 02 -> horde picked up the flag
8498 data << uint32(0xad1) << uint32(0x1); // 31 2769 Alliance top-stats (1 - show, 0 - hide) // 02 -> alliance picked up the flag
8499 data << uint32(0xabe) << uint32(0x0); // 32 2750 Horde resources
8500 data << uint32(0xabd) << uint32(0x0); // 33 2749 Alliance resources
8501 data << uint32(0xa05) << uint32(0x8e); // 34 2565 unk, constant?
8502 data << uint32(0xaa0) << uint32(0x0); // 35 2720 Capturing progress-bar (100 -> empty (only grey), 0 -> blue|red (no grey), default 0)
8503 data << uint32(0xa9f) << uint32(0x0); // 36 2719 Capturing progress-bar (0 - left, 100 - right)
8504 data << uint32(0xa9e) << uint32(0x0); // 37 2718 Capturing progress-bar (1 - show, 0 - hide)
8505 data << uint32(0xc0d) << uint32(0x17b); // 38 3085 unk
8506 // and some more ... unknown
8507 }
8508 break;
8509 // any of these needs change! the client remembers the prev setting!
8510 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8511 case 3483: // Hellfire Peninsula
8512 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_HP)
8513 pvp->FillInitialWorldStates(data);
8514 else
8515 {
8516 data << uint32(0x9ba) << uint32(0x1); // 10 // add ally tower main gui icon // maybe should be sent only on login?
8517 data << uint32(0x9b9) << uint32(0x1); // 11 // add horde tower main gui icon // maybe should be sent only on login?
8518 data << uint32(0x9b5) << uint32(0x0); // 12 // show neutral broken hill icon // 2485
8519 data << uint32(0x9b4) << uint32(0x1); // 13 // show icon above broken hill // 2484
8520 data << uint32(0x9b3) << uint32(0x0); // 14 // show ally broken hill icon // 2483
8521 data << uint32(0x9b2) << uint32(0x0); // 15 // show neutral overlook icon // 2482
8522 data << uint32(0x9b1) << uint32(0x1); // 16 // show the overlook arrow // 2481
8523 data << uint32(0x9b0) << uint32(0x0); // 17 // show ally overlook icon // 2480
8524 data << uint32(0x9ae) << uint32(0x0); // 18 // horde pvp objectives captured // 2478
8525 data << uint32(0x9ac) << uint32(0x0); // 19 // ally pvp objectives captured // 2476
8526 data << uint32(2475) << uint32(100); //: ally / horde slider grey area // show only in direct vicinity!
8527 data << uint32(2474) << uint32(50); //: ally / horde slider percentage, 100 for ally, 0 for horde // show only in direct vicinity!
8528 data << uint32(2473) << uint32(0); //: ally / horde slider display // show only in direct vicinity!
8529 data << uint32(0x9a8) << uint32(0x0); // 20 // show the neutral stadium icon // 2472
8530 data << uint32(0x9a7) << uint32(0x0); // 21 // show the ally stadium icon // 2471
8531 data << uint32(0x9a6) << uint32(0x1); // 22 // show the horde stadium icon // 2470
8532 }
8533 break;
8534 case 3518: // Nagrand
8535 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_NA)
8536 pvp->FillInitialWorldStates(data);
8537 else
8538 {
8539 data << uint32(2503) << uint32(0x0); // 10
8540 data << uint32(2502) << uint32(0x0); // 11
8541 data << uint32(2493) << uint32(0x0); // 12
8542 data << uint32(2491) << uint32(0x0); // 13
8543
8544 data << uint32(2495) << uint32(0x0); // 14
8545 data << uint32(2494) << uint32(0x0); // 15
8546 data << uint32(2497) << uint32(0x0); // 16
8547
8548 data << uint32(2762) << uint32(0x0); // 17
8549 data << uint32(2662) << uint32(0x0); // 18
8550 data << uint32(2663) << uint32(0x0); // 19
8551 data << uint32(2664) << uint32(0x0); // 20
8552
8553 data << uint32(2760) << uint32(0x0); // 21
8554 data << uint32(2670) << uint32(0x0); // 22
8555 data << uint32(2668) << uint32(0x0); // 23
8556 data << uint32(2669) << uint32(0x0); // 24
8557
8558 data << uint32(2761) << uint32(0x0); // 25
8559 data << uint32(2667) << uint32(0x0); // 26
8560 data << uint32(2665) << uint32(0x0); // 27
8561 data << uint32(2666) << uint32(0x0); // 28
8562
8563 data << uint32(2763) << uint32(0x0); // 29
8564 data << uint32(2659) << uint32(0x0); // 30
8565 data << uint32(2660) << uint32(0x0); // 31
8566 data << uint32(2661) << uint32(0x0); // 32
8567
8568 data << uint32(2671) << uint32(0x0); // 33
8569 data << uint32(2676) << uint32(0x0); // 34
8570 data << uint32(2677) << uint32(0x0); // 35
8571 data << uint32(2672) << uint32(0x0); // 36
8572 data << uint32(2673) << uint32(0x0); // 37
8573 }
8574 break;
8575 case 3519: // Terokkar Forest
8576 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_TF)
8577 pvp->FillInitialWorldStates(data);
8578 else
8579 {
8580 data << uint32(0xa41) << uint32(0x0); // 10 // 2625 capture bar pos
8581 data << uint32(0xa40) << uint32(0x14); // 11 // 2624 capture bar neutral
8582 data << uint32(0xa3f) << uint32(0x0); // 12 // 2623 show capture bar
8583 data << uint32(0xa3e) << uint32(0x0); // 13 // 2622 horde towers controlled
8584 data << uint32(0xa3d) << uint32(0x5); // 14 // 2621 ally towers controlled
8585 data << uint32(0xa3c) << uint32(0x0); // 15 // 2620 show towers controlled
8586 data << uint32(0xa88) << uint32(0x0); // 16 // 2696 SE Neu
8587 data << uint32(0xa87) << uint32(0x0); // 17 // SE Horde
8588 data << uint32(0xa86) << uint32(0x0); // 18 // SE Ally
8589 data << uint32(0xa85) << uint32(0x0); // 19 //S Neu
8590 data << uint32(0xa84) << uint32(0x0); // 20 S Horde
8591 data << uint32(0xa83) << uint32(0x0); // 21 S Ally
8592 data << uint32(0xa82) << uint32(0x0); // 22 NE Neu
8593 data << uint32(0xa81) << uint32(0x0); // 23 NE Horde
8594 data << uint32(0xa80) << uint32(0x0); // 24 NE Ally
8595 data << uint32(0xa7e) << uint32(0x0); // 25 // 2686 N Neu
8596 data << uint32(0xa7d) << uint32(0x0); // 26 N Horde
8597 data << uint32(0xa7c) << uint32(0x0); // 27 N Ally
8598 data << uint32(0xa7b) << uint32(0x0); // 28 NW Ally
8599 data << uint32(0xa7a) << uint32(0x0); // 29 NW Horde
8600 data << uint32(0xa79) << uint32(0x0); // 30 NW Neutral
8601 data << uint32(0x9d0) << uint32(0x5); // 31 // 2512 locked time remaining seconds first digit
8602 data << uint32(0x9ce) << uint32(0x0); // 32 // 2510 locked time remaining seconds second digit
8603 data << uint32(0x9cd) << uint32(0x0); // 33 // 2509 locked time remaining minutes
8604 data << uint32(0x9cc) << uint32(0x0); // 34 // 2508 neutral locked time show
8605 data << uint32(0xad0) << uint32(0x0); // 35 // 2768 horde locked time show
8606 data << uint32(0xacf) << uint32(0x1); // 36 // 2767 ally locked time show
8607 }
8608 break;
8609 case 3521: // Zangarmarsh
8610 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_ZM)
8611 pvp->FillInitialWorldStates(data);
8612 else
8613 {
8614 data << uint32(0x9e1) << uint32(0x0); // 10 //2529
8615 data << uint32(0x9e0) << uint32(0x0); // 11
8616 data << uint32(0x9df) << uint32(0x0); // 12
8617 data << uint32(0xa5d) << uint32(0x1); // 13 //2653
8618 data << uint32(0xa5c) << uint32(0x0); // 14 //2652 east beacon neutral
8619 data << uint32(0xa5b) << uint32(0x1); // 15 horde
8620 data << uint32(0xa5a) << uint32(0x0); // 16 ally
8621 data << uint32(0xa59) << uint32(0x1); // 17 // 2649 Twin spire graveyard horde 12???
8622 data << uint32(0xa58) << uint32(0x0); // 18 ally 14 ???
8623 data << uint32(0xa57) << uint32(0x0); // 19 neutral 7???
8624 data << uint32(0xa56) << uint32(0x0); // 20 // 2646 west beacon neutral
8625 data << uint32(0xa55) << uint32(0x1); // 21 horde
8626 data << uint32(0xa54) << uint32(0x0); // 22 ally
8627 data << uint32(0x9e7) << uint32(0x0); // 23 // 2535
8628 data << uint32(0x9e6) << uint32(0x0); // 24
8629 data << uint32(0x9e5) << uint32(0x0); // 25
8630 data << uint32(0xa00) << uint32(0x0); // 26 // 2560
8631 data << uint32(0x9ff) << uint32(0x1); // 27
8632 data << uint32(0x9fe) << uint32(0x0); // 28
8633 data << uint32(0x9fd) << uint32(0x0); // 29
8634 data << uint32(0x9fc) << uint32(0x1); // 30
8635 data << uint32(0x9fb) << uint32(0x0); // 31
8636 data << uint32(0xa62) << uint32(0x0); // 32 // 2658
8637 data << uint32(0xa61) << uint32(0x1); // 33
8638 data << uint32(0xa60) << uint32(0x1); // 34
8639 data << uint32(0xa5f) << uint32(0x0); // 35
8640 }
8641 break;
8642 case 3698: // Nagrand Arena
8643 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_NA)
8644 bg->FillInitialWorldStates(data);
8645 else
8646 {
8647 data << uint32(0xa0f) << uint32(0x0); // 7
8648 data << uint32(0xa10) << uint32(0x0); // 8
8649 data << uint32(0xa11) << uint32(0x0); // 9 show
8650 }
8651 break;
8652 case 3702: // Blade's Edge Arena
8653 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_BE)
8654 bg->FillInitialWorldStates(data);
8655 else
8656 {
8657 data << uint32(0x9f0) << uint32(0x0); // 7 gold
8658 data << uint32(0x9f1) << uint32(0x0); // 8 green
8659 data << uint32(0x9f3) << uint32(0x0); // 9 show
8660 }
8661 break;
8662 case 3968: // Ruins of Lordaeron
8663 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RL)
8664 bg->FillInitialWorldStates(data);
8665 else
8666 {
8667 data << uint32(0xbb8) << uint32(0x0); // 7 gold
8668 data << uint32(0xbb9) << uint32(0x0); // 8 green
8669 data << uint32(0xbba) << uint32(0x0); // 9 show
8670 }
8671 break;
8672 case 4378: // Dalaran Sewers
8673 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_DS)
8674 bg->FillInitialWorldStates(data);
8675 else
8676 {
8677 data << uint32(3601) << uint32(0x0); // 7 gold
8678 data << uint32(3600) << uint32(0x0); // 8 green
8679 data << uint32(3610) << uint32(0x0); // 9 show
8680 }
8681 break;
8682 case 4384: // Strand of the Ancients
8683 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA)
8684 bg->FillInitialWorldStates(data);
8685 else
8686 {
8687 // 1-3 A defend, 4-6 H defend, 7-9 unk defend, 1 - ok, 2 - half destroyed, 3 - destroyed
8688 data << uint32(0xf09) << uint32(0x0); // 7 3849 Gate of Temple
8689 data << uint32(0xe36) << uint32(0x0); // 8 3638 Gate of Yellow Moon
8690 data << uint32(0xe27) << uint32(0x0); // 9 3623 Gate of Green Emerald
8691 data << uint32(0xe24) << uint32(0x0); // 10 3620 Gate of Blue Sapphire
8692 data << uint32(0xe21) << uint32(0x0); // 11 3617 Gate of Red Sun
8693 data << uint32(0xe1e) << uint32(0x0); // 12 3614 Gate of Purple Ametyst
8694
8695 data << uint32(0xdf3) << uint32(0x0); // 13 3571 bonus timer (1 - on, 0 - off)
8696 data << uint32(0xded) << uint32(0x0); // 14 3565 Horde Attacker
8697 data << uint32(0xdec) << uint32(0x0); // 15 3564 Alliance Attacker
8698 // End Round (timer), better explain this by example, eg. ends in 19:59 -> A:BC
8699 data << uint32(0xde9) << uint32(0x0); // 16 3561 C
8700 data << uint32(0xde8) << uint32(0x0); // 17 3560 B
8701 data << uint32(0xde7) << uint32(0x0); // 18 3559 A
8702 data << uint32(0xe35) << uint32(0x0); // 19 3637 East g - Horde control
8703 data << uint32(0xe34) << uint32(0x0); // 20 3636 West g - Horde control
8704 data << uint32(0xe33) << uint32(0x0); // 21 3635 South g - Horde control
8705 data << uint32(0xe32) << uint32(0x0); // 22 3634 East g - Alliance control
8706 data << uint32(0xe31) << uint32(0x0); // 23 3633 West g - Alliance control
8707 data << uint32(0xe30) << uint32(0x0); // 24 3632 South g - Alliance control
8708 data << uint32(0xe2f) << uint32(0x0); // 25 3631 Chamber of Ancients - Horde control
8709 data << uint32(0xe2e) << uint32(0x0); // 26 3630 Chamber of Ancients - Alliance control
8710 data << uint32(0xe2d) << uint32(0x0); // 27 3629 Beach1 - Horde control
8711 data << uint32(0xe2c) << uint32(0x0); // 28 3628 Beach2 - Horde control
8712 data << uint32(0xe2b) << uint32(0x0); // 29 3627 Beach1 - Alliance control
8713 data << uint32(0xe2a) << uint32(0x0); // 30 3626 Beach2 - Alliance control
8714 // and many unks...
8715 }
8716 break;
8717 case 4406: // Ring of Valor
8718 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RV)
8719 bg->FillInitialWorldStates(data);
8720 else
8721 {
8722 data << uint32(0xe10) << uint32(0x0); // 7 gold
8723 data << uint32(0xe11) << uint32(0x0); // 8 green
8724 data << uint32(0xe1a) << uint32(0x0); // 9 show
8725 }
8726 break;
8727 case 4710: // Isle of Conquest
8728 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC)
8729 bg->FillInitialWorldStates(data);
8730 else
8731 {
8732 data << uint32(4221) << uint32(1); // 7 BG_IC_ALLIANCE_RENFORT_SET
8733 data << uint32(4222) << uint32(1); // 8 BG_IC_HORDE_RENFORT_SET
8734 data << uint32(4226) << uint32(300); // 9 BG_IC_ALLIANCE_RENFORT
8735 data << uint32(4227) << uint32(300); // 10 BG_IC_HORDE_RENFORT
8736 data << uint32(4322) << uint32(1); // 11 BG_IC_GATE_FRONT_H_WS_OPEN
8737 data << uint32(4321) << uint32(1); // 12 BG_IC_GATE_WEST_H_WS_OPEN
8738 data << uint32(4320) << uint32(1); // 13 BG_IC_GATE_EAST_H_WS_OPEN
8739 data << uint32(4323) << uint32(1); // 14 BG_IC_GATE_FRONT_A_WS_OPEN
8740 data << uint32(4324) << uint32(1); // 15 BG_IC_GATE_WEST_A_WS_OPEN
8741 data << uint32(4325) << uint32(1); // 16 BG_IC_GATE_EAST_A_WS_OPEN
8742 data << uint32(4317) << uint32(1); // 17 unknown
8743
8744 data << uint32(4301) << uint32(1); // 18 BG_IC_DOCKS_UNCONTROLLED
8745 data << uint32(4296) << uint32(1); // 19 BG_IC_HANGAR_UNCONTROLLED
8746 data << uint32(4306) << uint32(1); // 20 BG_IC_QUARRY_UNCONTROLLED
8747 data << uint32(4311) << uint32(1); // 21 BG_IC_REFINERY_UNCONTROLLED
8748 data << uint32(4294) << uint32(1); // 22 BG_IC_WORKSHOP_UNCONTROLLED
8749 data << uint32(4243) << uint32(1); // 23 unknown
8750 data << uint32(4345) << uint32(1); // 24 unknown
8751 }
8752 break;
8753 // The Ruby Sanctum
8754 case 4987:
8755 if (instance && mapid == 724)
8756 instance->FillInitialWorldStates(data);
8757 else
8758 {
8759 data << uint32(5049) << uint32(50); // 9 WORLDSTATE_CORPOREALITY_MATERIAL
8760 data << uint32(5050) << uint32(50); // 10 WORLDSTATE_CORPOREALITY_TWILIGHT
8761 data << uint32(5051) << uint32(0); // 11 WORLDSTATE_CORPOREALITY_TOGGLE
8762 }
8763 break;
8764 // Icecrown Citadel
8765 case 4812:
8766 if (instance && mapid == 631)
8767 instance->FillInitialWorldStates(data);
8768 else
8769 {
8770 data << uint32(4903) << uint32(0); // 9 WORLDSTATE_SHOW_TIMER (Blood Quickening weekly)
8771 data << uint32(4904) << uint32(30); // 10 WORLDSTATE_EXECUTION_TIME
8772 data << uint32(4940) << uint32(0); // 11 WORLDSTATE_SHOW_ATTEMPTS
8773 data << uint32(4941) << uint32(50); // 12 WORLDSTATE_ATTEMPTS_REMAINING
8774 data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
8775 }
8776 break;
8777 // The Culling of Stratholme
8778 case 4100:
8779 if (instance && mapid == 595)
8780 instance->FillInitialWorldStates(data);
8781 else
8782 {
8783 data << uint32(3479) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES
8784 data << uint32(3480) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED
8785 data << uint32(3504) << uint32(0); // 11 WORLDSTATE_WAVE_COUNT
8786 data << uint32(3931) << uint32(25); // 12 WORLDSTATE_TIME_GUARDIAN
8787 data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
8788 }
8789 break;
8790 // The Oculus
8791 case 4228:
8792 if (instance && mapid == 578)
8793 instance->FillInitialWorldStates(data);
8794 else
8795 {
8796 data << uint32(3524) << uint32(0); // 9 WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW
8797 data << uint32(3486) << uint32(0); // 10 WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT
8798 }
8799 break;
8800 // Ulduar
8801 case 4273:
8802 if (instance && mapid == 603)
8803 instance->FillInitialWorldStates(data);
8804 else
8805 {
8806 data << uint32(4132) << uint32(0); // 9 WORLDSTATE_ALGALON_TIMER_ENABLED
8807 data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER
8808 }
8809 break;
8810 // Halls of Refection
8811 case 4820:
8812 if (instance && mapid == 668)
8813 instance->FillInitialWorldStates(data);
8814 else
8815 {
8816 data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
8817 data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
8818 }
8819 break;
8820 // Scarlet Enclave (DK starting zone)
8821 case 4298:
8822 // Get Mograine, GUID and ENTRY should NEVER change
8823 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8824 {
8825 if (CreatureAI* mograineAI = mograine->AI())
8826 {
8827 data << uint32(3590) << uint32(mograineAI->GetData(3590));
8828 data << uint32(3591) << uint32(mograineAI->GetData(3591));
8829 data << uint32(3592) << uint32(mograineAI->GetData(3592));
8830 data << uint32(3603) << uint32(mograineAI->GetData(3603));
8831 data << uint32(3604) << uint32(mograineAI->GetData(3604));
8832 data << uint32(3605) << uint32(mograineAI->GetData(3605));
8833 }
8834 }
8835 break;
8836 // Wintergrasp
8837 case 4197:
8838 if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
8839 {
8840 bf->FillInitialWorldStates(data);
8841 break;
8842 }
8843 [[fallthrough]];
8844 default:
8845 data << uint32(0x914) << uint32(0x0); // 7
8846 data << uint32(0x913) << uint32(0x0); // 8
8847 data << uint32(0x912) << uint32(0x0); // 9
8848 data << uint32(0x915) << uint32(0x0); // 10
8849 break;
8850 }
8851 }
8852
8853 sWorldState->FillInitialWorldStates(data, zoneid, areaid);
8854
8855 uint16 length = (data.wpos() - countPos) / 8;
8856 data.put<uint16>(countPos, length);
8857
8858 GetSession()->SendPacket(&data);
8861}
@ BATTLEFIELD_WG
Definition Battlefield.h:29
@ CONFIG_ARENA_SEASON_ID
Definition IWorld.h:328
@ CONFIG_ARENA_SEASON_IN_PROGRESS
Definition IWorld.h:119
@ OUTDOOR_PVP_SI
Definition OutdoorPvP.h:33
@ OUTDOOR_PVP_TF
Definition OutdoorPvP.h:31
@ OUTDOOR_PVP_ZM
Definition OutdoorPvP.h:32
@ OUTDOOR_PVP_EP
Definition OutdoorPvP.h:34
@ OUTDOOR_PVP_NA
Definition OutdoorPvP.h:30
@ OUTDOOR_PVP_HP
Definition OutdoorPvP.h:29
@ BATTLEGROUND_IC
Definition SharedDefines.h:3492
@ BATTLEGROUND_WS
Definition SharedDefines.h:3482
@ BATTLEGROUND_EY
Definition SharedDefines.h:3487
@ BATTLEGROUND_AV
Definition SharedDefines.h:3481
@ BATTLEGROUND_BE
Definition SharedDefines.h:3485
@ BATTLEGROUND_RV
Definition SharedDefines.h:3491
@ BATTLEGROUND_NA
Definition SharedDefines.h:3484
@ BATTLEGROUND_DS
Definition SharedDefines.h:3490
@ BATTLEGROUND_SA
Definition SharedDefines.h:3489
@ BATTLEGROUND_AB
Definition SharedDefines.h:3483
@ BATTLEGROUND_RL
Definition SharedDefines.h:3488
virtual void FillInitialWorldStates(WorldPacket &)=0
uint32 GetTypeId()
Definition Battlefield.h:241
virtual void FillInitialWorldStates(WorldPacket &)
Definition Battleground.h:460
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition Battleground.h:329
Definition CreatureAI.h:70
Definition InstanceScript.h:142
virtual void FillInitialWorldStates(WorldPacket &)
Definition InstanceScript.h:263
Definition OutdoorPvP.h:185
virtual void FillInitialWorldStates(WorldPacket &)
Definition OutdoorPvP.h:202
uint32 GetTypeId() const
Definition OutdoorPvP.h:237
void SendBGWeekendWorldStates()
Definition Player.cpp:8863
void SendBattlefieldWorldStates()
Definition Player.cpp:8878
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition Player.h:16184
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1203
@ SMSG_INIT_WORLD_STATES
Definition Opcodes.h:736

References BATTLEFIELD_WG, BATTLEGROUND_AB, BATTLEGROUND_AV, BATTLEGROUND_BE, BATTLEGROUND_DS, BATTLEGROUND_EY, BATTLEGROUND_IC, BATTLEGROUND_NA, BATTLEGROUND_RL, BATTLEGROUND_RV, BATTLEGROUND_SA, BATTLEGROUND_WS, bgZoneIdToFillWorldStates, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_SEASON_IN_PROGRESS, Battleground::FillInitialWorldStates(), InstanceScript::FillInitialWorldStates(), OutdoorPvP::FillInitialWorldStates(), Battlefield::FillInitialWorldStates(), GetBattleground(), Battleground::GetBgTypeID(), ObjectAccessor::GetCreature(), WorldObject::GetInstanceScript(), WorldLocation::GetMapId(), GetSession(), Battlefield::GetTypeId(), OutdoorPvP::GetTypeId(), LOG_DEBUG, OUTDOOR_PVP_EP, OUTDOOR_PVP_HP, OUTDOOR_PVP_NA, OUTDOOR_PVP_SI, OUTDOOR_PVP_TF, OUTDOOR_PVP_ZM, ByteBuffer::put(), sBattlefieldMgr, SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), WorldSession::SendPacket(), SMSG_INIT_WORLD_STATES, sOutdoorPvPMgr, sWorld, sWorldState, and ByteBuffer::wpos().

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), and UpdateZone().

◆ SendInstanceResetWarning()

void Player::SendInstanceResetWarning ( uint32  mapid,
Difficulty  difficulty,
uint32  time,
bool  onEnterMap 
)
11774{
11775 // pussywizard:
11776 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11777 if (bind && bind->extended)
11778 {
11779 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11780 return;
11781 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11782 }
11783
11784 // type of warning, based on the time remaining until reset
11785 uint32 type;
11786 if (time > 3600)
11787 type = RAID_INSTANCE_WELCOME;
11788 else if (time > 900)
11790 else if (time > 300)
11792 else
11794
11795 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11796 data << uint32(type);
11797 data << uint32(mapid);
11798 data << uint32(difficulty); // difficulty
11799 data << uint32(time);
11800 if (type == RAID_INSTANCE_WELCOME)
11801 {
11802 data << uint8(bind && bind->perm); // is locked
11803 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11804 }
11805 GetSession()->SendPacket(&data);
11806}
@ RAID_INSTANCE_WARNING_MIN
Definition Player.h:809
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition Player.h:810
@ RAID_INSTANCE_WARNING_HOURS
Definition Player.h:808
@ RAID_INSTANCE_WELCOME
Definition Player.h:811
time_t GetExtendedResetTime() const
Definition InstanceSaveMgr.h:76
time_t GetResetTime() const
Definition InstanceSaveMgr.h:75
@ SMSG_RAID_INSTANCE_MESSAGE
Definition Opcodes.h:792
Definition InstanceSaveMgr.h:39
InstanceSave * save
Definition InstanceSaveMgr.h:40
bool extended
Definition InstanceSaveMgr.h:42
bool perm
Definition InstanceSaveMgr.h:41

References InstancePlayerBind::extended, InstanceSave::GetExtendedResetTime(), Object::GetGUID(), InstanceSave::GetResetTime(), GetSession(), InstancePlayerBind::perm, RAID_INSTANCE_WARNING_HOURS, RAID_INSTANCE_WARNING_MIN, RAID_INSTANCE_WARNING_MIN_SOON, RAID_INSTANCE_WELCOME, InstancePlayerBind::save, WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_RAID_INSTANCE_MESSAGE.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendItemDurations()

void Player::SendItemDurations ( )
4743{
4744 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4745 {
4746 (*itr)->SendTimeUpdate(this);
4747 }
4748}

References m_itemDuration.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendItemRetrievalMail() [1/2]

void Player::SendItemRetrievalMail ( std::vector< std::pair< uint32, uint32 > >  mailItems)
445{
446 if (mailItems.empty())
447 {
448 // Skip send if empty items
449 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Attempt to send almost with items without items. Player {}", GetGUID().ToString());
450 return;
451 }
452
453 using SendMailTempateVector = std::vector<std::pair<uint32, uint32>>;
454
455 std::vector<SendMailTempateVector> allItems;
456
457 auto AddMailItem = [&allItems](uint32 itemEntry, uint32 itemCount)
458 {
459 SendMailTempateVector toSendItems;
460
461 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemEntry);
462 if (!itemTemplate)
463 {
464 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Item id {} is invalid", itemEntry);
465 return;
466 }
467
468 if (itemCount < 1 || (itemTemplate->MaxCount > 0 && itemCount > static_cast<uint32>(itemTemplate->MaxCount)))
469 {
470 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Incorrect item count ({}) for item id {}", itemEntry, itemCount);
471 return;
472 }
473
474 while (itemCount > itemTemplate->GetMaxStackSize())
475 {
476 if (toSendItems.size() <= MAX_MAIL_ITEMS)
477 {
478 toSendItems.emplace_back(itemEntry, itemTemplate->GetMaxStackSize());
479 itemCount -= itemTemplate->GetMaxStackSize();
480 }
481 else
482 {
483 allItems.emplace_back(toSendItems);
484 toSendItems.clear();
485 }
486 }
487
488 toSendItems.emplace_back(itemEntry, itemCount);
489 allItems.emplace_back(toSendItems);
490 };
491
492 for (auto& [itemEntry, itemCount] : mailItems)
493 {
494 AddMailItem(itemEntry, itemCount);
495 }
496
497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
498
499 for (auto const& items : allItems)
500 {
501 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
502 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
503
504 for (auto const& [itemEntry, itemCount] : items)
505 {
506 if (Item* mailItem = Item::CreateItem(itemEntry, itemCount))
507 {
508 mailItem->SaveToDB(trans);
509 draft.AddItem(mailItem);
510 }
511 }
512
513 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
514 }
515
516 CharacterDatabase.CommitTransaction(trans);
517}

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), LOG_ERROR, MAIL_CREATURE, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, MailDraft::SendMailTo(), sObjectMgr, and Position::ToString().

◆ SendItemRetrievalMail() [2/2]

void Player::SendItemRetrievalMail ( uint32  itemEntry,
uint32  count 
)

◆ SendLearnPacket()

void Player::SendLearnPacket ( uint32  spellId,
bool  learn 
)
3053{
3054 if (learn)
3055 {
3057 data << uint32(spellId);
3058 data << uint16(0);
3059 GetSession()->SendPacket(&data);
3060 }
3061 else
3062 {
3064 data << uint32(spellId);
3065 GetSession()->SendPacket(&data);
3066 }
3067}
@ SMSG_REMOVED_SPELL
Definition Opcodes.h:545
@ SMSG_LEARNED_SPELL
Definition Opcodes.h:329

References GetSession(), WorldSession::SendPacket(), SMSG_LEARNED_SPELL, and SMSG_REMOVED_SPELL.

Referenced by _addSpell(), ActivateSpec(), addTalent(), Spell::EffectApplyGlyph(), WorldSession::HandleRemoveGlyph(), learnSpell(), LearnTalent(), removeSpell(), and resetTalents().

◆ SendLogXPGain()

void Player::SendLogXPGain ( uint32  GivenXP,
Unit victim,
uint32  BonusXP,
bool  recruitAFriend = false,
float  group_rate = 1.0f 
)
2377{
2378 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2379 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2380 data << uint32(GivenXP + BonusXP); // given experience
2381 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2382
2383 if (victim)
2384 {
2385 data << uint32(GivenXP); // experience without bonus
2386
2387 // should use group_rate here but can't figure out how
2388 data << float(1); // 1 - none 0 - 100% group bonus output
2389 }
2390
2391 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2392 GetSession()->SendPacket(&data);
2393}
@ SMSG_LOG_XPGAIN
Definition Opcodes.h:494

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), and SMSG_LOG_XPGAIN.

Referenced by GiveXP().

◆ SendLoot()

void Player::SendLoot ( ObjectGuid  guid,
LootType  loot_type 
)
7810{
7811 if (ObjectGuid lguid = GetLootGUID())
7812 m_session->DoLootRelease(lguid);
7813
7814 Loot* loot = 0;
7815 PermissionTypes permission = ALL_PERMISSION;
7816
7817 LOG_DEBUG("loot", "Player::SendLoot");
7818
7819 // remove FD and invisibility at all loots
7820 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7821 for (auto const& aura : toRemove)
7822 {
7823 RemoveAurasByType(aura);
7824 }
7825 // remove stealth only if looting a corpse
7826 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7827 {
7829 }
7830
7831 if (guid.IsGameObject())
7832 {
7833 LOG_DEBUG("loot", "guid.IsGameObject");
7834 GameObject* go = GetMap()->GetGameObject(guid);
7835
7836 // not check distance for GO in case owned GO (fishing bobber case, for example)
7837 // And permit out of range GO with no owner in case fishing hole
7838 if (!go || (loot_type != LOOT_FISHINGHOLE && ((loot_type != LOOT_FISHING && loot_type != LOOT_FISHING_JUNK) || go->GetOwnerGUID() != GetGUID()) && !go->IsWithinDistInMap(this)) || (loot_type == LOOT_CORPSE && go->GetRespawnTime() && go->isSpawnedByDefault()))
7839 {
7841 SendLootRelease(guid);
7842 return;
7843 }
7844
7845 loot = &go->loot;
7846
7847 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7848 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7849 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7851
7852 if (go->getLootState() == GO_READY)
7853 {
7854 uint32 lootid = go->GetGOInfo()->GetLootId();
7855
7856 //TODO: fix this big hack
7858 if (Battleground* bg = GetBattleground())
7859 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7860 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7861 {
7863 SendLootRelease(guid);
7864 return;
7865 }
7866
7867 if (lootid)
7868 {
7869 loot->clear();
7870
7871 Group* group = GetGroup();
7872 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7873
7874 // check current RR player and get next if necessary
7875 if (groupRules)
7876 group->UpdateLooterGuid(go, true);
7877
7878 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7880
7881 // get next RR player (for next loot)
7882 if (groupRules && !go->loot.empty())
7883 group->UpdateLooterGuid(go);
7884 }
7885 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7886 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7887
7888 if (loot_type == LOOT_FISHING)
7889 go->GetFishLoot(loot, this);
7890 else if (loot_type == LOOT_FISHING_JUNK)
7891 go->GetFishLoot(loot, this, true);
7892
7894 {
7895 if (Group* group = GetGroup())
7896 {
7897 switch (group->GetLootMethod())
7898 {
7899 case GROUP_LOOT:
7900 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7901 group->GroupLoot(loot, go);
7902 break;
7903 case NEED_BEFORE_GREED:
7904 group->NeedBeforeGreed(loot, go);
7905 break;
7906 case MASTER_LOOT:
7907 group->MasterLoot(loot, go);
7908 break;
7909 default:
7910 break;
7911 }
7912 }
7913 }
7914
7915 go->SetLootState(GO_ACTIVATED, this);
7916 }
7917
7918 if (go->getLootState() == GO_ACTIVATED)
7919 {
7920 if (Group* group = GetGroup())
7921 {
7922 switch (group->GetLootMethod())
7923 {
7924 case MASTER_LOOT:
7926 break;
7927 case FREE_FOR_ALL:
7928 permission = ALL_PERMISSION;
7929 break;
7930 case ROUND_ROBIN:
7931 permission = ROUND_ROBIN_PERMISSION;
7932 break;
7933 default:
7934 permission = GROUP_PERMISSION;
7935 break;
7936 }
7937 }
7938 else
7939 permission = ALL_PERMISSION;
7940 }
7941 }
7942 else if (guid.IsItem())
7943 {
7944 Item* item = GetItemByGuid(guid);
7945
7946 if (!item)
7947 {
7948 SendLootRelease(guid);
7949 return;
7950 }
7951
7952 permission = OWNER_PERMISSION;
7953
7954 loot = &item->loot;
7955
7956 // Xinef: Store container id
7957 loot->containerGUID = item->GetGUID();
7958
7959 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7960 {
7961 item->m_lootGenerated = true;
7962 loot->clear();
7963
7964 switch (loot_type)
7965 {
7966 case LOOT_DISENCHANTING:
7967 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7968 break;
7969 case LOOT_PROSPECTING:
7970 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7971 break;
7972 case LOOT_MILLING:
7973 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7974 break;
7975 default:
7977 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
7978
7979 // Xinef: Add to storage
7980 if (loot->gold > 0 || loot->unlootedCount > 0)
7981 sLootItemStorage->AddNewStoredLoot(loot, this);
7982
7983 break;
7984 }
7985 }
7986 }
7987 else if (guid.IsCorpse()) // remove insignia
7988 {
7989 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
7990
7991 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
7992 {
7993 SendLootRelease(guid);
7994 return;
7995 }
7996
7997 loot = &bones->loot;
7998
7999 if (loot->loot_type == LOOT_NONE)
8000 {
8001 uint32 pLevel = bones->loot.gold;
8002 bones->loot.clear();
8003
8004 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
8005
8006 // It may need a better formula
8007 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
8008 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
8009 }
8010
8011 if (bones->lootRecipient != this)
8012 permission = NONE_PERMISSION;
8013 else
8014 permission = OWNER_PERMISSION;
8015 }
8016 else
8017 {
8018 Creature* creature = GetMap()->GetCreature(guid);
8019
8020 // must be in range and creature must be alive for pickpocket and must be dead for another loot
8021 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
8022 {
8023 SendLootRelease(guid);
8024 return;
8025 }
8026
8027 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
8028 {
8029 SendLootRelease(guid);
8030 return;
8031 }
8032
8033 loot = &creature->loot;
8034
8035 if (loot_type == LOOT_PICKPOCKETING)
8036 {
8037 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
8038 {
8039 if (creature->CanGeneratePickPocketLoot())
8040 {
8041 creature->SetPickPocketLootTime();
8042 loot->clear();
8043
8044 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
8045 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
8046
8047 // Generate extra money for pick pocket loot
8048 const uint32 a = urand(0, creature->GetLevel() / 2);
8049 const uint32 b = urand(0, GetLevel() / 2);
8050 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
8051 permission = OWNER_PERMISSION;
8052 }
8053 else
8054 {
8055 permission = NONE_PERMISSION;
8057 return;
8058 }
8059 }
8060 }
8061 else
8062 {
8063 // Xinef: Exploit fix
8064 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
8065 {
8067 return;
8068 }
8069
8070 // the player whose group may loot the corpse
8071 Player* recipient = creature->GetLootRecipient();
8072 Group* recipientGroup = creature->GetLootRecipientGroup();
8073 if (!recipient && !recipientGroup)
8074 return;
8075
8076 if (loot->loot_type == LOOT_NONE)
8077 {
8078 // for creature, loot is filled when creature is killed.
8079 if (recipientGroup)
8080 {
8081 switch (recipientGroup->GetLootMethod())
8082 {
8083 case GROUP_LOOT:
8084 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
8085 recipientGroup->GroupLoot(loot, creature);
8086 break;
8087 case NEED_BEFORE_GREED:
8088 recipientGroup->NeedBeforeGreed(loot, creature);
8089 break;
8090 case MASTER_LOOT:
8091 recipientGroup->MasterLoot(loot, creature);
8092 break;
8093 default:
8094 break;
8095 }
8096 }
8097 }
8098
8099 // if loot is already skinning loot then don't do anything else
8100 if (loot->loot_type == LOOT_SKINNING)
8101 {
8102 loot_type = LOOT_SKINNING;
8103 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
8104 }
8105 else if (loot_type == LOOT_SKINNING)
8106 {
8107 loot->clear();
8108 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
8109 permission = OWNER_PERMISSION;
8110
8111 //Inform instance if creature is skinned.
8112 if (InstanceScript* mapInstance = creature->GetInstanceScript())
8113 {
8114 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
8115 }
8116
8117 // Xinef: Set new loot recipient
8118 creature->SetLootRecipient(this, false);
8119 }
8120 // set group rights only for loot_type != LOOT_SKINNING
8121 else
8122 {
8123 if (recipientGroup)
8124 {
8125 if (GetGroup() == recipientGroup)
8126 {
8127 switch (recipientGroup->GetLootMethod())
8128 {
8129 case MASTER_LOOT:
8130 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
8131 break;
8132 case FREE_FOR_ALL:
8133 permission = ALL_PERMISSION;
8134 break;
8135 case ROUND_ROBIN:
8136 permission = ROUND_ROBIN_PERMISSION;
8137 break;
8138 default:
8139 permission = GROUP_PERMISSION;
8140 break;
8141 }
8142 }
8143 else
8144 permission = NONE_PERMISSION;
8145 }
8146 else if (recipient == this)
8147 permission = OWNER_PERMISSION;
8148 else
8149 permission = NONE_PERMISSION;
8150 }
8151 }
8152 }
8153
8154 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8155 switch (loot_type)
8156 {
8157 case LOOT_INSIGNIA:
8158 loot_type = LOOT_SKINNING;
8159 break;
8160 case LOOT_FISHINGHOLE:
8161 loot_type = LOOT_FISHING;
8162 break;
8163 case LOOT_FISHING_JUNK:
8164 loot_type = LOOT_FISHING;
8165 break;
8166 default:
8167 break;
8168 }
8169
8170 // need know merged fishing/corpse loot type for achievements
8171 loot->loot_type = loot_type;
8172
8173 if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid))
8174 {
8176 return;
8177 }
8178
8179 if (permission != NONE_PERMISSION)
8180 {
8181 SetLootGUID(guid);
8182
8183 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8184 data << guid;
8185 data << uint8(loot_type);
8186 data << LootView(*loot, this, permission);
8187
8188 SendDirectMessage(&data);
8189
8190 // add 'this' player as one of the players that are looting 'loot'
8191 loot->AddLooter(GetGUID());
8192
8193 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8195 }
8196 else
8198}
@ BG_AV_OBJECTID_MINE_N
Definition BattlegroundAV.h:160
@ BG_AV_OBJECTID_MINE_S
Definition BattlegroundAV.h:161
@ CORPSE_BONES
Definition Corpse.h:28
@ GO_ACTIVATED
Definition GameObject.h:112
@ GO_READY
Definition GameObject.h:111
@ RATE_DROP_MONEY
Definition IWorld.h:466
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Player("player_loot_template", "team id", true)
PermissionTypes
Definition LootMgr.h:66
@ OWNER_PERMISSION
Definition LootMgr.h:72
@ ALL_PERMISSION
Definition LootMgr.h:67
@ RESTRICTED_PERMISSION
Definition LootMgr.h:70
@ NONE_PERMISSION
Definition LootMgr.h:73
@ ROUND_ROBIN_PERMISSION
Definition LootMgr.h:71
@ MASTER_PERMISSION
Definition LootMgr.h:69
@ GROUP_PERMISSION
Definition LootMgr.h:68
@ LOOT_ERROR_DIDNT_KILL
Definition LootMgr.h:96
@ LOOT_ERROR_ALREADY_PICKPOCKETED
Definition LootMgr.h:107
@ LOOT_PICKPOCKETING
Definition LootMgr.h:81
@ LOOT_MILLING
Definition LootMgr.h:87
@ LOOT_FISHING_JUNK
Definition LootMgr.h:91
@ LOOT_CORPSE
Definition LootMgr.h:80
@ LOOT_FISHING
Definition LootMgr.h:82
@ LOOT_DISENCHANTING
Definition LootMgr.h:83
@ LOOT_FISHINGHOLE
Definition LootMgr.h:89
@ LOOT_NONE
Definition LootMgr.h:78
@ LOOT_PROSPECTING
Definition LootMgr.h:86
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1563
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3121
@ SPELL_AURA_MOD_INVISIBILITY
Definition SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition SpellAuraDefines.h:79
@ GAMEOBJECT_BYTES_1
Definition UpdateFields.h:404
Loot loot
Definition Creature.h:229
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1325
ObjectGuid GetLootRecipientGUID() const
Definition Creature.h:230
void SetPickPocketLootTime()
Definition Creature.cpp:3784
Player * GetLootRecipient() const
Definition Creature.cpp:1311
bool CanGeneratePickPocketLoot() const
Definition Creature.cpp:3789
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1318
uint32 GetRespawnDelay() const
Definition GameObject.h:197
bool IsWithinDistInMap(Player const *player) const
Definition GameObject.cpp:2987
Loot loot
Definition GameObject.h:246
LootState getLootState() const
Definition GameObject.h:223
bool isSpawnedByDefault() const
Definition GameObject.h:195
void GetFishLoot(Loot *fishLoot, Player *lootOwner, bool junk=false)
Definition GameObject.cpp:1004
time_t GetRespawnTime() const
Definition GameObject.h:183
uint32 GetLootGenerationTime() const
Definition GameObject.h:257
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2426
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition GameObject.cpp:914
void SetLootGenerationTime()
Definition GameObject.cpp:2916
uint16 GetLootMode() const
Definition GameObject.h:227
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1156
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2322
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1002
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1864
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1307
Loot loot
Definition Item.h:320
bool IsCorpse() const
Definition ObjectGuid.h:173
bool IsItem() const
Definition ObjectGuid.h:170
bool IsGameObject() const
Definition ObjectGuid.h:171
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:122
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2078
void SendLootRelease(ObjectGuid guid)
Definition Player.cpp:7802
void SetLootGUID(ObjectGuid guid)
Definition Player.h:2001
void SendLootError(ObjectGuid guid, LootError error)
Definition Player.cpp:8200
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10295
@ SMSG_LOOT_RESPONSE
Definition Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:179
uint32 SkinLootId
Definition CreatureData.h:226
uint32 pickpocketLootId
Definition CreatureData.h:225
Definition GameObjectData.h:664
uint32 type
Definition GameObjectData.h:33
uint32 groupLootRules
Definition GameObjectData.h:98
struct GameObjectTemplate::@231::@236 chest
uint32 GetLootId() const
Definition GameObjectData.h:539
uint32 DisenchantID
Definition ItemTemplate.h:690
uint32 MinMoneyLoot
Definition ItemTemplate.h:692
uint32 MaxMoneyLoot
Definition ItemTemplate.h:693
Definition LootMgr.h:405
void AddLooter(ObjectGuid GUID)
Definition LootMgr.h:373
ObjectGuid containerGUID
Definition LootMgr.h:329
bool empty() const
Definition LootMgr.h:367
void clear()
Definition LootMgr.h:343
uint8 unlootedCount
Definition LootMgr.h:323
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:837

References Loot::AddLooter(), ALL_PERMISSION, BATTLEGROUND_AV, BG_AV_OBJECTID_MINE_N, BG_AV_OBJECTID_MINE_S, Creature::CanGeneratePickPocketLoot(), GameObjectTemplate::chest, Loot::clear(), Loot::containerGUID, CORPSE_BONES, CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, ItemTemplate::DisenchantID, WorldSession::DoLootRelease(), Loot::empty(), Loot::FillLoot(), Object::ForceValuesUpdateAtIndex(), FREE_FOR_ALL, GAMEOBJECT_BYTES_1, GAMEOBJECT_TYPE_CHEST, Loot::generateMoneyLoot(), GetBattleground(), ObjectAccessor::GetCorpse(), Map::GetCreature(), Creature::GetCreatureTemplate(), Object::GetEntry(), GameObject::GetFishLoot(), Map::GetGameObject(), GameTime::GetGameTime(), GameObject::GetGOInfo(), GetGroup(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetInstanceScript(), GetItemByGuid(), Unit::GetLevel(), GameObject::GetLootGenerationTime(), GetLootGUID(), GameObjectTemplate::GetLootId(), Group::GetLootMethod(), GameObject::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GameObject::getLootState(), WorldObject::GetMap(), Group::GetMasterLooterGuid(), GameObject::GetOwnerGUID(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTime(), GetTeamId(), Item::GetTemplate(), GameObject::GetTemplateAddon(), Corpse::GetType(), GO_ACTIVATED, GO_READY, Loot::gold, GROUP_LOOT, GROUP_PERMISSION, Group::GroupLoot(), GameObjectTemplate::groupLootRules, Object::HasDynamicFlag(), Object::HasFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), ObjectGuid::IsCorpse(), Unit::IsFriendlyTo(), ObjectGuid::IsGameObject(), ObjectGuid::IsItem(), Loot::isLooted(), GameObject::isSpawnedByDefault(), GameObject::IsWithinDistInMap(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Corpse::loot, Creature::loot, GameObject::loot, Item::loot, LOOT_CORPSE, LOOT_DISENCHANTING, LOOT_ERROR_ALREADY_PICKPOCKETED, LOOT_ERROR_DIDNT_KILL, LOOT_FISHING, LOOT_FISHING_JUNK, LOOT_FISHINGHOLE, LOOT_INSIGNIA, LOOT_MILLING, LOOT_NONE, LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_SKINNING, Loot::loot_type, Corpse::lootRecipient, LootTemplates_Disenchant, LootTemplates_Gameobject, LootTemplates_Item, LootTemplates_Milling, LootTemplates_Pickpocketing, LootTemplates_Player, LootTemplates_Prospecting, LootTemplates_Skinning, Item::m_lootGenerated, m_session, MASTER_LOOT, MASTER_PERMISSION, Group::MasterLoot(), ItemTemplate::MaxMoneyLoot, ItemTemplate::MinMoneyLoot, NEED_BEFORE_GREED, Group::NeedBeforeGreed(), NONE_PERMISSION, OWNER_PERMISSION, CreatureTemplate::pickpocketLootId, RATE_DROP_MONEY, Unit::RemoveAurasByType(), RESTRICTED_PERMISSION, ROUND_ROBIN, ROUND_ROBIN_PERMISSION, SendDirectMessage(), SendLootError(), SendLootRelease(), GameObject::SetLootGenerationTime(), SetLootGUID(), Creature::SetLootRecipient(), GameObject::SetLootState(), Creature::SetPickPocketLootTime(), Unit::SetUnitFlag(), CreatureTemplate::SkinLootId, sLootItemStorage, SMSG_LOOT_RESPONSE, SPELL_AURA_FEIGN_DEATH, SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_MOD_STEALTH, sScriptMgr, sWorld, GameObjectTemplate::type, UNIT_DYNFLAG_LOOTABLE, UNIT_FLAG_LOOTING, Loot::unlootedCount, Group::UpdateLooterGuid(), and urand().

Referenced by Spell::EffectMilling(), Spell::EffectPickPocket(), Spell::EffectProspecting(), Spell::EffectSkinning(), WorldSession::HandleLootOpcode(), WorldSession::HandleOpenItemOpcode(), go_hive_pod::OnGossipHello(), RemovedInsignia(), Spell::SendLoot(), and GameObject::Use().

◆ SendLootError()

void Player::SendLootError ( ObjectGuid  guid,
LootError  error 
)

◆ SendLootRelease()

void Player::SendLootRelease ( ObjectGuid  guid)
7803{
7805 data << guid << uint8(1);
7806 SendDirectMessage(&data);
7807}
@ SMSG_LOOT_RELEASE_RESPONSE
Definition Opcodes.h:383

References SendDirectMessage(), and SMSG_LOOT_RELEASE_RESPONSE.

Referenced by WorldSession::DoLootRelease(), WorldSession::HandleAutostoreLootItemOpcode(), SendLoot(), and StoreLootItem().

◆ SendMailResult()

void Player::SendMailResult ( uint32  mailId,
MailResponseType  mailAction,
MailResponseResult  mailError,
uint32  equipError = 0,
ObjectGuid::LowType  item_guid = 0,
uint32  item_count = 0 
)
2881{
2882 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2883 data << (uint32) mailId;
2884 data << (uint32) mailAction;
2885 data << (uint32) mailError;
2886 if (mailError == MAIL_ERR_EQUIP_ERROR)
2887 data << (uint32) equipError;
2888 else if (mailAction == MAIL_ITEM_TAKEN)
2889 {
2890 data << (uint32) item_guid; // item guid low?
2891 data << (uint32) item_count; // item count?
2892 }
2893 GetSession()->SendPacket(&data);
2894}
@ MAIL_ITEM_TAKEN
Definition SharedDefines.h:3502
@ MAIL_ERR_EQUIP_ERROR
Definition SharedDefines.h:3511
@ SMSG_SEND_MAIL_RESULT
Definition Opcodes.h:599

References GetSession(), MAIL_ERR_EQUIP_ERROR, MAIL_ITEM_TAKEN, WorldSession::SendPacket(), and SMSG_SEND_MAIL_RESULT.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and WorldSession::HandleSendMail().

◆ SendMessageToSet() [1/2]

◆ SendMessageToSet() [2/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
Player const *  skipped_rcvr 
) const
overridevirtual

Reimplemented from WorldObject.

5718{
5719 if (skipped_rcvr != this)
5720 SendDirectMessage(data);
5721
5722 Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr);
5724}
Definition GridNotifiers.h:100
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:192

References WorldObject::GetVisibilityRange(), SendDirectMessage(), and Cell::VisitWorldObjects().

◆ SendMessageToSetInRange() [1/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self 
) const
overridevirtual

Reimplemented from WorldObject.

5696{
5697 if (self)
5698 SendDirectMessage(data);
5699
5700 Acore::MessageDistDeliverer notifier(this, data, dist);
5701 Cell::VisitWorldObjects(this, notifier, dist);
5702}

References SendDirectMessage(), and Cell::VisitWorldObjects().

Referenced by Say(), AchievementMgr::SendAchievementEarned(), SendMessageToSet(), TextEmote(), and Yell().

◆ SendMessageToSetInRange() [2/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self,
bool  includeMargin,
bool  ownTeamOnly,
bool  required3dDist = false 
) const
5705{
5706 if (self)
5707 SendDirectMessage(data);
5708
5709 dist += GetObjectSize();
5710 if (includeMargin)
5711 dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
5712
5713 Acore::MessageDistDeliverer notifier(this, data, dist, ownTeamOnly, nullptr, required3dDist);
5714 Cell::VisitWorldObjects(this, notifier, dist);
5715}
#define VISIBILITY_COMPENSATION
Definition ObjectDefines.h:26
float GetObjectSize() const
Definition Object.cpp:2784

References WorldObject::GetObjectSize(), SendDirectMessage(), VISIBILITY_COMPENSATION, and Cell::VisitWorldObjects().

◆ SendMirrorTimer()

void Player::SendMirrorTimer ( MirrorTimerType  Type,
uint32  MaxValue,
uint32  CurrentValue,
int32  Regen 
)
protected
733{
734 if (int(MaxValue) == DISABLED_MIRROR_TIMER)
735 {
736 if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
737 StopMirrorTimer(Type);
738 return;
739 }
740 SendDirectMessage(WorldPackets::Misc::StartMirrorTimer(Type, CurrentValue, MaxValue, Regen, 0, 0).Write());
741}
Definition MiscPackets.h:121

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5743{
5745 data << uint32(MovieId);
5746 SendDirectMessage(&data);
5747}
@ SMSG_TRIGGER_MOVIE
Definition Opcodes.h:1154

References SendDirectMessage(), and SMSG_TRIGGER_MOVIE.

Referenced by debug_commandscript::HandleDebugPlayMovieCommand().

◆ SendNewItem()

void Player::SendNewItem ( Item item,
uint32  count,
bool  received,
bool  created,
bool  broadcast = false,
bool  sendChatMessage = true 
)
4751{
4752 if (!item) // prevent crash
4753 return;
4754
4755 // last check 2.0.10
4756 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4757 data << GetGUID(); // player GUID
4758 data << uint32(received); // 0=looted, 1=from npc
4759 data << uint32(created); // 0=received, 1=created
4760 data << uint32(sendChatMessage); // bool print message to chat
4761 data << uint8(item->GetBagSlot()); // bagslot
4762 // item slot, but when added to stack: 0xFFFFFFFF
4763 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4764 data << uint32(item->GetEntry()); // item id
4765 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4766 data << int32(item->GetItemRandomPropertyId()); // random item property id
4767 data << uint32(count); // count of items
4768 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4769
4770 if (broadcast && GetGroup())
4771 GetGroup()->BroadcastPacket(&data, true);
4772 else
4773 GetSession()->SendPacket(&data);
4774}
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1753
@ SMSG_ITEM_PUSH_RESULT
Definition Opcodes.h:388

References Group::BroadcastPacket(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetItemCount(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), GetSession(), Item::GetSlot(), WorldSession::SendPacket(), and SMSG_ITEM_PUSH_RESULT.

Referenced by _StoreOrEquipNewItem(), AddItem(), AutoStoreLoot(), Spell::DoCreateItem(), GiveQuestSourceItem(), misc_commandscript::HandleAddItemCommand(), misc_commandscript::HandleAddItemSetCommand(), AuraEffect::HandleChannelDeathItem(), OPvPCapturePointNA::HandleCustomSpell(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandlePetitionBuyOpcode(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2897{
2898 // deliver undelivered mail
2900 data << (uint32) 0;
2901 GetSession()->SendPacket(&data);
2902}
@ SMSG_RECEIVED_MAIL
Definition Opcodes.h:675

References GetSession(), WorldSession::SendPacket(), and SMSG_RECEIVED_MAIL.

Referenced by AddNewMailDeliverTime(), and Update().

◆ SendNotifyLootItemRemoved()

void Player::SendNotifyLootItemRemoved ( uint8  lootSlot)
8216{
8218 data << uint8(lootSlot);
8219 GetSession()->SendPacket(&data);
8220}
@ SMSG_LOOT_REMOVED
Definition Opcodes.h:384

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_REMOVED.

Referenced by Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), and StoreLootItem().

◆ SendNotifyLootMoneyRemoved()

void Player::SendNotifyLootMoneyRemoved ( )
8210{
8212 GetSession()->SendPacket(&data);
8213}
@ SMSG_LOOT_CLEAR_MONEY
Definition Opcodes.h:387

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_CLEAR_MONEY.

Referenced by Loot::NotifyMoneyRemoved().

◆ SendPreparedGossip()

void Player::SendPreparedGossip ( WorldObject source)
210{
211 if (!source)
212 return;
213
214 if (source->IsCreature())
215 {
216 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
218 {
219 SendPreparedQuest(source->GetGUID());
220 return;
221 }
222 }
223 else if (source->IsGameObject())
224 {
225 // probably need to find a better way here
227 {
228 SendPreparedQuest(source->GetGUID());
229 return;
230 }
231 }
232
233 // in case non empty gossip menu (that not included quests list size) show it
234 // (quest entries from quest menu will be included in list)
235
236 uint32 textId = GetGossipTextId(source);
237
239 textId = GetGossipTextId(menuId, source);
240
241 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
242}
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:315
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition GossipDef.cpp:193
bool Empty() const
Definition GossipDef.h:242

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Unit::HasNpcFlag(), Object::IsCreature(), Object::IsGameObject(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), and UNIT_NPC_FLAG_GOSSIP.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ SendPreparedQuest()

void Player::SendPreparedQuest ( ObjectGuid  guid)
Todo:
verify if check for !quest->IsDaily() is really correct (possibly not)
116{
117 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
118 if (questMenu.Empty())
119 return;
120
121 // single element case
122 if (questMenu.GetMenuItemCount() == 1)
123 {
124 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
125 uint32 questId = qmi0.QuestId;
126
127 // Auto open -- maybe also should verify there is no greeting
128 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
129 {
130 if (qmi0.QuestIcon == 4)
131 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
132 // Send completable on repeatable and autoCompletable quest if player don't have quest
134 else
135 {
137 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
138 {
140 return;
141 }
142
143 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
144 AddQuestAndCheckCompletion(quest, object);
145
146 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
148 else
150 }
151 }
152 }
153 // multiple entries
154 else
155 {
156 QEmote qe;
157 qe._Delay = 0;
158 qe._Emote = 0;
159 std::string title = "";
160
161 // need pet case for some quests
163 if (creature)
164 {
165 uint32 textid = GetGossipTextId(creature);
166 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
167 if (!gossiptext)
168 {
169 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
170 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
171 title = "";
172 }
173 else
174 {
175 qe = gossiptext->Options[0].Emotes[0];
176
177 if (!gossiptext->Options[0].Text_0.empty())
178 {
179 title = gossiptext->Options[0].Text_0;
180
181 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
182 if (loc_idx >= 0)
183 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
184 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
185 }
186 else
187 {
188 title = gossiptext->Options[0].Text_1;
189
190 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
191 if (loc_idx >= 0)
192 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
193 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
194 }
195 }
196 }
197
199 }
200}
@ TYPEMASK_ITEM
Definition ObjectGuid.h:47
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
Definition Object.h:103
virtual bool hasQuest(uint32) const
Definition Object.h:189
virtual bool hasInvolvedQuest(uint32) const
Definition Object.h:190
void SendQuestGiverQuestList(QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
Definition GossipDef.cpp:315
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition GossipDef.cpp:388
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition GossipDef.cpp:752
bool CanAddQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:264
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition PlayerQuest.cpp:421
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition PlayerQuest.cpp:366
QuestMenuItem const & GetItem(uint16 index) const
Definition GossipDef.h:249
uint8 GetMenuItemCount() const
Definition GossipDef.h:237
std::string Text_0
Definition NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition NPCHandler.h:39
std::string Text_1
Definition NPCHandler.h:35
Definition NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition NPCHandler.h:46
Definition NPCHandler.h:55
Definition NPCHandler.h:25
uint32 _Emote
Definition NPCHandler.h:26
uint32 _Delay
Definition NPCHandler.h:27
Definition GossipDef.h:155
uint32 QuestId
Definition GossipDef.h:156
uint8 QuestIcon
Definition GossipDef.h:157

References QEmote::_Delay, QEmote::_Emote, AddQuestAndCheckCompletion(), CanAddQuest(), CanCompleteRepeatableQuest(), CanRewardQuest(), CanTakeQuest(), GossipTextOption::Emotes, QuestMenu::Empty(), ObjectAccessor::GetCreatureOrPetOrVehicle(), GetGossipTextId(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), ObjectAccessor::GetObjectByTypeMask(), PlayerMenu::GetQuestMenu(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Object::hasInvolvedQuest(), Object::hasQuest(), GossipText::Options, PlayerTalkClass, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, PlayerMenu::SendCloseGossip(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestGiverQuestList(), PlayerMenu::SendQuestGiverRequestItems(), sObjectMgr, GossipTextOption::Text_0, GossipTextOption::Text_1, TYPEMASK_GAMEOBJECT, TYPEMASK_ITEM, and TYPEMASK_UNIT.

Referenced by npc_cos_chromie_middle::OnGossipHello(), OnGossipSelect(), SendPreparedGossip(), npc_costumed_orphan_matron::sGossipHello(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ SendProficiency()

void Player::SendProficiency ( ItemClass  itemClass,
uint32  itemSubclassMask 
)
10139{
10140 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10141 data << uint8(itemClass) << uint32(itemSubclassMask);
10142 GetSession()->SendPacket(&data);
10143}
@ SMSG_SET_PROFICIENCY
Definition Opcodes.h:325

References GetSession(), WorldSession::SendPacket(), and SMSG_SET_PROFICIENCY.

Referenced by Spell::EffectProficiency().

◆ SendPushToPartyResponse()

void Player::SendPushToPartyResponse ( Player const *  player,
uint8  msg 
) const
2436{
2437 if (player)
2438 {
2439 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2440 data << player->GetGUID();
2441 data << uint8(msg); // valid values: 0-8
2442 GetSession()->SendPacket(&data);
2443 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2444 }
2445}
@ MSG_QUEST_PUSH_RESULT
Definition Opcodes.h:660

References Object::GetGUID(), GetSession(), LOG_DEBUG, MSG_QUEST_PUSH_RESULT, and WorldSession::SendPacket().

Referenced by CanShareQuest(), debug_commandscript::HandleDebugSendQuestPartyMsgCommand(), WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestComplete()

void Player::SendQuestComplete ( uint32  quest_id)
2347{
2348 if (quest_id)
2349 {
2351 data << uint32(quest_id);
2352 GetSession()->SendPacket(&data);
2353 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2354 }
2355}
@ SMSG_QUESTUPDATE_COMPLETE
Definition Opcodes.h:438

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_COMPLETE.

Referenced by AreaExploredOrEventHappens().

◆ SendQuestConfirmAccept()

void Player::SendQuestConfirmAccept ( Quest const *  quest,
Player pReceiver 
)
2414{
2415 if (pReceiver)
2416 {
2417 //load locale from db
2418 std::string strTitle = quest->GetTitle();
2419
2420 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2421 if (loc_idx >= 0)
2422 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2423 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2424
2425 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2426 data << uint32(quest->GetQuestId());
2427 data << quest->GetTitle();
2428 data << GetGUID();
2429 pReceiver->GetSession()->SendPacket(&data);
2430
2431 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2432 }
2433}
@ SMSG_QUEST_CONFIRM_ACCEPT
Definition Opcodes.h:442

References Object::GetGUID(), ObjectMgr::GetLocaleString(), Quest::GetQuestId(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LOG_DEBUG, WorldSession::SendPacket(), SMSG_QUEST_CONFIRM_ACCEPT, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestFailed()

void Player::SendQuestFailed ( uint32  questId,
InventoryResult  reason = EQUIP_ERR_OK 
)
2383{
2384 if (questId)
2385 {
2387 data << uint32(questId);
2388 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2389 GetSession()->SendPacket(&data);
2390 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2391 }
2392}
@ SMSG_QUESTGIVER_QUEST_FAILED
Definition Opcodes.h:432

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTGIVER_QUEST_FAILED.

Referenced by FailQuest().

◆ SendQuestGiverStatusMultiple()

void Player::SendQuestGiverStatusMultiple ( )
protected
7725{
7726 uint32 count = 0;
7727
7729 data << uint32(count); // placeholder
7730
7731 for (GuidUnorderedSet::const_iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
7732 {
7733 uint32 questStatus = DIALOG_STATUS_NONE;
7734
7735 if ((*itr).IsAnyTypeCreature())
7736 {
7737 // need also pet quests case support
7738 Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
7739 if (!questgiver || questgiver->IsHostileTo(this))
7740 continue;
7741 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7742 continue;
7743
7744 questStatus = GetQuestDialogStatus(questgiver);
7745
7746 data << questgiver->GetGUID();
7747 data << uint8(questStatus);
7748 ++count;
7749 }
7750 else if ((*itr).IsGameObject())
7751 {
7752 GameObject* questgiver = GetMap()->GetGameObject(*itr);
7753 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7754 continue;
7755
7756 questStatus = GetQuestDialogStatus(questgiver);
7757
7758 data << questgiver->GetGUID();
7759 data << uint8(questStatus);
7760 ++count;
7761 }
7762 }
7763
7764 data.put<uint32>(0, count); // write real count
7765 GetSession()->SendPacket(&data);
7766}
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition PlayerQuest.cpp:1595
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition Opcodes.h:1078

References DIALOG_STATUS_NONE, GAMEOBJECT_TYPE_QUESTGIVER, ObjectAccessor::GetCreatureOrPetOrVehicle(), Map::GetGameObject(), GameObject::GetGoType(), Object::GetGUID(), WorldObject::GetMap(), GetQuestDialogStatus(), GetSession(), Unit::HasNpcFlag(), Unit::IsHostileTo(), m_clientGUIDs, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_QUESTGIVER_STATUS_MULTIPLE, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by GiveLevel(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleQuestgiverStatusMultipleQuery(), RewardQuest(), and SendInitialPacketsAfterAddToMap().

◆ SendQuestReward()

void Player::SendQuestReward ( Quest const *  quest,
uint32  XP 
)
2358{
2359 uint32 questid = quest->GetQuestId();
2360 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2361 sGameEventMgr->HandleQuestComplete(questid);
2362 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2363 data << uint32(questid);
2364
2365 if (!IsMaxLevel())
2366 {
2367 data << uint32(XP);
2368 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2369 }
2370 else
2371 {
2372 data << uint32(0);
2373 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2374 }
2375
2376 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2377 data << uint32(quest->GetBonusTalents()); // bonus talents
2378 data << uint32(quest->GetRewArenaPoints());
2379 GetSession()->SendPacket(&data);
2380}
bool IsMaxLevel() const
Definition Player.cpp:2575
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition Opcodes.h:431

References Quest::CalculateHonorGain(), Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), GetSession(), IsMaxLevel(), LOG_DEBUG, WorldSession::SendPacket(), sGameEventMgr, and SMSG_QUESTGIVER_QUEST_COMPLETE.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2395{
2396 if (quest_id)
2397 {
2399 data << uint32(quest_id);
2400 GetSession()->SendPacket(&data);
2401 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2402 }
2403}
@ SMSG_QUESTUPDATE_FAILEDTIMER
Definition Opcodes.h:437

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_FAILEDTIMER.

Referenced by FailQuest().

◆ SendQuestUpdate()

void Player::SendQuestUpdate ( uint32  questId)
1527{
1528 uint32 zone = 0, area = 0;
1529 // xinef: fixup
1530 uint32 oldSpellId = 0;
1531
1532 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1533 if (saBounds.first != saBounds.second)
1534 {
1535 GetZoneAndAreaId(zone, area);
1536
1537 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1538 {
1539 // xinef: spell was already casted, skip different areas with same spell
1540 if (itr->second->spellId == oldSpellId)
1541 continue;
1542 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1543 if (!HasAura(itr->second->spellId))
1544 {
1545 CastSpell(this, itr->second->spellId, true);
1546 oldSpellId = itr->second->spellId;
1547 }
1548 }
1549 }
1550
1551 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1552
1553 // xinef: fixup
1554 uint32 skipSpellId = 0;
1555 oldSpellId = 0;
1556 if (saBounds.first != saBounds.second)
1557 {
1558 if (!zone || !area)
1559 GetZoneAndAreaId(zone, area);
1560
1561 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1562 {
1563 // xinef: skip spell for which condition is already fulfilled
1564 if (itr->second->spellId == skipSpellId)
1565 continue;
1566 skipSpellId = 0;
1567
1568 // xinef: spells are sorted, if no condition is fulfilled remove aura
1569 if (oldSpellId && oldSpellId != itr->second->spellId)
1570 {
1571 RemoveAurasDueToSpell(oldSpellId);
1572 oldSpellId = 0;
1573 }
1574
1575 if (!itr->second->IsFitToRequirements(this, zone, area))
1576 {
1577 //RemoveAurasDueToSpell(itr->second->spellId);
1578 oldSpellId = itr->second->spellId;
1579 }
1580 else
1581 {
1582 skipSpellId = itr->second->spellId;
1583 oldSpellId = 0;
1584 }
1585 }
1586
1587 // xinef: check if we have something to remove yet
1588 if (oldSpellId)
1589 RemoveAurasDueToSpell(oldSpellId);
1590 }
1591
1593}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition SpellMgr.h:548

References Unit::CastSpell(), WorldObject::GetZoneAndAreaId(), Unit::HasAura(), Unit::RemoveAurasDueToSpell(), sSpellMgr, and UpdateForQuestWorldObjects().

Referenced by AddQuest(), RemoveActiveQuest(), RemoveRewardedQuest(), RewardQuest(), and SetQuestStatus().

◆ SendQuestUpdateAddCreatureOrGo()

void Player::SendQuestUpdateAddCreatureOrGo ( Quest const *  quest,
ObjectGuid  guid,
uint32  creatureOrGO_idx,
uint16  old_count,
uint16  add_count 
)
2457{
2458 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2459
2460 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2461 if (entry < 0)
2462 // client expected gameobject template id in form (id|0x80000000)
2463 entry = (-entry) | 0x80000000;
2464
2465 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2466 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2467 data << uint32(quest->GetQuestId());
2468 data << uint32(entry);
2469 data << uint32(old_count + add_count);
2470 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2471 data << guid;
2472 GetSession()->SendPacket(&data);
2473
2474 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2475 if (log_slot < MAX_QUEST_LOG_SIZE)
2476 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2477}
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition Player.h:1496
@ SMSG_QUESTUPDATE_ADD_KILL
Definition Opcodes.h:439

References ASSERT, FindQuestSlot(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_KILL.

Referenced by KillCreditGO(), KilledMonsterCredit(), and TalkedToCreature().

◆ SendQuestUpdateAddItem()

void Player::SendQuestUpdateAddItem ( Quest const *  quest,
uint32  item_idx,
uint16  count 
)
2448{
2450 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2451 //data << quest->RequiredItemId[item_idx];
2452 //data << count;
2453 GetSession()->SendPacket(&data);
2454}
@ SMSG_QUESTUPDATE_ADD_ITEM
Definition Opcodes.h:440

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_ADD_ITEM.

◆ SendQuestUpdateAddPlayer()

void Player::SendQuestUpdateAddPlayer ( Quest const *  quest,
uint16  old_count,
uint16  add_count 
)
2480{
2481 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2482
2484 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2485 data << uint32(quest->GetQuestId());
2486 data << uint32(old_count + add_count);
2487 data << uint32(quest->GetPlayersSlain());
2488 GetSession()->SendPacket(&data);
2489
2490 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2491 if (log_slot < MAX_QUEST_LOG_SIZE)
2493}
@ SMSG_QUESTUPDATE_ADD_PVP_KILL
Definition Opcodes.h:1165

References ASSERT, FindQuestSlot(), Quest::GetPlayersSlain(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, QUEST_PVP_KILL_SLOT, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_PVP_KILL.

Referenced by KilledPlayerCreditForQuest().

◆ SendRaidDifficulty()

void Player::SendRaidDifficulty ( bool  IsInGroup,
int32  forcedDifficulty = -1 
)
178{
179 uint8 val = 0x00000001;
181 data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty);
182 data << uint32(val);
183 data << uint32(IsInGroup);
184 GetSession()->SendPacket(&data);
185}
@ MSG_SET_RAID_DIFFICULTY
Definition Opcodes.h:1289

References GetRaidDifficulty(), GetSession(), MSG_SET_RAID_DIFFICULTY, and WorldSession::SendPacket().

Referenced by Group::AddMember(), WorldSession::HandleSetRaidDifficultyOpcode(), SendInitialPacketsAfterAddToMap(), and Group::SetRaidDifficulty().

◆ SendRaidInfo()

void Player::SendRaidInfo ( )
6521{
6522 uint32 counter = 0;
6523
6525
6526 std::size_t p_counter = data.wpos();
6527 data << uint32(counter); // placeholder
6528
6529 time_t now = GameTime::GetGameTime().count();
6530
6531 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6532 {
6533 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6534 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6535 {
6536 if (itr->second.perm)
6537 {
6538 InstanceSave* save = itr->second.save;
6539 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6540 data << uint32(save->GetMapId()); // map id
6541 data << uint32(save->GetDifficulty()); // difficulty
6542 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6543 data << uint8(1); // expired = 0
6544 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6545 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6546 ++counter;
6547 }
6548 }
6549 }
6550 data.put<uint32>(p_counter, counter);
6551 GetSession()->SendPacket(&data);
6552}
Difficulty GetDifficulty() const
Definition InstanceSaveMgr.h:63
@ SMSG_RAID_INSTANCE_INFO
Definition Opcodes.h:746

References InstanceSave::GetDifficulty(), InstanceSave::GetExtendedResetTime(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), InstanceSave::GetResetTime(), GetSession(), MAX_DIFFICULTY, ByteBuffer::put(), WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_RAID_INSTANCE_INFO, and ByteBuffer::wpos().

Referenced by WorldSession::HandleRequestRaidInfoOpcode().

◆ SendRefundInfo()

void Player::SendRefundInfo ( Item item)
private
15557{
15558 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15559 item->UpdatePlayedTime(this);
15560
15561 if (!item->IsRefundable())
15562 {
15563 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15564 return;
15565 }
15566
15567 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15568 {
15569 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15570 item->SetNotRefundable(this);
15571 return;
15572 }
15573
15574 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15575 if (!iece)
15576 {
15577 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15578 return;
15579 }
15580
15581 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15582 data << item->GetGUID(); // item guid
15583 data << uint32(item->GetPaidMoney()); // money cost
15584 data << uint32(iece->reqhonorpoints); // honor point cost
15585 data << uint32(iece->reqarenapoints); // arena point cost
15586 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15587 {
15588 data << uint32(iece->reqitem[i]);
15589 data << uint32(iece->reqitemcount[i]);
15590 }
15591 data << uint32(0);
15592 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15593 GetSession()->SendPacket(&data);
15594}
uint32 GetTotalPlayedTime()
Definition Player.h:1203
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition Opcodes.h:1232

References Object::GetGUID(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetSession(), GetTotalPlayedTime(), Item::IsRefundable(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_INFO_RESPONSE, and Item::UpdatePlayedTime().

Referenced by WorldSession::HandleItemRefundInfoRequest(), and SwapItem().

◆ SendRemoveControlBar()

void Player::SendRemoveControlBar ( )
9735{
9737 data << uint64(0);
9738 GetSession()->SendPacket(&data);
9739}

References GetSession(), WorldSession::SendPacket(), and SMSG_PET_SPELLS.

Referenced by Unit::RemoveCharmedBy(), and Unit::SetMinion().

◆ SendResetFailedNotify()

void Player::SendResetFailedNotify ( uint32  mapid)
188{
190 data << uint32(mapid);
191 GetSession()->SendPacket(&data);
192}
@ SMSG_RESET_FAILED_NOTIFY
Definition Opcodes.h:948

References GetSession(), WorldSession::SendPacket(), and SMSG_RESET_FAILED_NOTIFY.

◆ SendResetInstanceFailed()

void Player::SendResetInstanceFailed ( uint32  reason,
uint32  MapId 
)
334{
335 /*reasons for instance reset failure:
336 // 0: There are players inside the instance.
337 // 1: There are players offline in your party.
338 // 2>: There are players in your party attempting to zone into an instance.
339 */
341 data << uint32(reason);
342 data << uint32(MapId);
343 GetSession()->SendPacket(&data);
344}
@ SMSG_INSTANCE_RESET_FAILED
Definition Opcodes.h:829

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET_FAILED.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendResetInstanceSuccess()

void Player::SendResetInstanceSuccess ( uint32  MapId)
327{
329 data << uint32(MapId);
330 GetSession()->SendPacket(&data);
331}
@ SMSG_INSTANCE_RESET
Definition Opcodes.h:828

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendRespondInspectAchievements()

void Player::SendRespondInspectAchievements ( Player player) const
13952{
13954}
void SendRespondInspectAchievements(Player *player) const
Definition AchievementMgr.cpp:2389

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6558{
6559 bool hasBeenSaved = false;
6560 WorldPacket data;
6561
6562 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6563 {
6564 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6565 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6566 {
6567 if (itr->second.perm) // only permanent binds are sent
6568 {
6569 hasBeenSaved = true;
6570 break;
6571 }
6572 }
6573 }
6574
6575 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6577 data << uint32(hasBeenSaved);
6578 GetSession()->SendPacket(&data);
6579
6580 if (!hasBeenSaved)
6581 return;
6582
6583 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6584 {
6585 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6586 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6587 {
6588 if (itr->second.perm)
6589 {
6591 data << uint32(itr->second.save->GetMapId());
6592 GetSession()->SendPacket(&data);
6593 }
6594 }
6595 }
6596}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition Opcodes.h:830

References Object::GetGUID(), GetSession(), WorldPacket::Initialize(), MAX_DIFFICULTY, WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_UPDATE_INSTANCE_OWNERSHIP, and SMSG_UPDATE_LAST_INSTANCE.

Referenced by TeleportTo().

◆ SendSellError()

void Player::SendSellError ( SellResult  msg,
Creature creature,
ObjectGuid  guid,
uint32  param 
)
4077{
4078 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4079 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4080 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4081 data << guid;
4082 if (param > 0)
4083 data << uint32(param);
4084 data << uint8(msg);
4085 GetSession()->SendPacket(&data);
4086}
@ SMSG_SELL_ITEM
Definition Opcodes.h:447

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_SELL_ITEM.

Referenced by WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendSellErrorCommand(), WorldSession::HandleSellItemOpcode(), and WorldSession::SendListInventory().

◆ SendSystemMessage()

void Player::SendSystemMessage ( std::string_view  msg,
bool  escapeCharacters = false 
)
16395{
16396 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16397}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8917{
8918 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8919 data << guid;
8920 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8921 data << cost;
8922 GetSession()->SendPacket(&data);
8923}
@ MSG_TALENT_WIPE_CONFIRM
Definition Opcodes.h:712

References CONFIG_NO_RESET_TALENT_COST, GetSession(), MSG_TALENT_WIPE_CONFIRM, resetTalentsCost(), WorldSession::SendPacket(), and sWorld.

Referenced by Spell::EffectUntrainTalents(), and OnGossipSelect().

◆ SendTaxiNodeStatusMultiple()

void Player::SendTaxiNodeStatusMultiple ( )
10544{
10545 for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
10546 {
10547 if (!itr->IsCreature())
10548 {
10549 continue;
10550 }
10551
10552 Creature* creature = ObjectAccessor::GetCreature(*this, *itr);
10553 if (!creature || creature->IsHostileTo(this))
10554 {
10555 continue;
10556 }
10557
10558 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10559 {
10560 continue;
10561 }
10562
10563 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10564 if (!nearestNode)
10565 {
10566 continue;
10567 }
10568
10570 data << *itr;
10571 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10572 SendDirectMessage(&data);
10573 }
10574}
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition PlayerTaxi.h:35
@ SMSG_TAXINODE_STATUS
Definition Opcodes.h:457

References ObjectAccessor::GetCreature(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), Unit::HasNpcFlag(), Unit::IsHostileTo(), PlayerTaxi::IsTaximaskNodeKnown(), m_clientGUIDs, m_taxi, SendDirectMessage(), SMSG_TAXINODE_STATUS, sObjectMgr, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendTeleportAckPacket()

void Player::SendTeleportAckPacket ( )
1326{
1328 data << GetPackGUID();
1329 data << uint32(0); // this value increments every time
1330 BuildMovementPacket(&data);
1331 GetSession()->SendPacket(&data);
1332}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19966
@ MSG_MOVE_TELEPORT_ACK
Definition Opcodes.h:229

References Unit::BuildMovementPacket(), Object::GetPackGUID(), GetSession(), MSG_MOVE_TELEPORT_ACK, and WorldSession::SendPacket().

Referenced by TeleportTo().

◆ SendTransferAborted()

void Player::SendTransferAborted ( uint32  mapid,
TransferAbortReason  reason,
uint8  arg = 0 
)
11755{
11757 data << uint32(mapid);
11758 data << uint8(reason); // transfer abort reason
11759 switch (reason)
11760 {
11764 // these are the ONLY cases that have an extra argument in the packet!!!
11765 data << uint8(arg);
11766 break;
11767 default:
11768 break;
11769 }
11770 GetSession()->SendPacket(&data);
11771}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition Player.h:796
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition Player.h:794
@ SMSG_TRANSFER_ABORTED
Definition Opcodes.h:94

References GetSession(), WorldSession::SendPacket(), SMSG_TRANSFER_ABORTED, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_INSUF_EXPAN_LVL, and TRANSFER_ABORT_UNIQUE_MESSAGE.

Referenced by InstanceMap::CannotEnter(), MapMgr::PlayerCannotEnter(), Satisfy(), and TeleportTo().

◆ SendUpdateToOutOfRangeGroupMembers()

void Player::SendUpdateToOutOfRangeGroupMembers ( )
11742{
11744 return;
11745 if (Group* group = GetGroup())
11746 group->UpdatePlayerOutOfRange(this);
11747
11750 if (Pet* pet = GetPet())
11751 pet->ResetAuraUpdateMaskForRaid();
11752}
@ GROUP_UPDATE_FLAG_NONE
Definition Group.h:99

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2236{
2238 worldstate.VariableID = variable;
2239 worldstate.Value = value;
2240 SendDirectMessage(worldstate.Write());
2241}
Definition WorldStatePackets.h:50
int32 Value
Definition WorldStatePackets.h:57
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:40
int32 VariableID
Definition WorldStatePackets.h:56

References SendDirectMessage(), WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by debug_commandscript::HandleDebugUpdateWorldStateCommand(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), OPvPCapturePointEP_EWT::HandlePlayerEnter(), OPvPCapturePointEP_NPT::HandlePlayerEnter(), OPvPCapturePointEP_CGT::HandlePlayerEnter(), OPvPCapturePointEP_PWT::HandlePlayerEnter(), OPvPCapturePointGH::HandlePlayerEnter(), OPvPCapturePointHP::HandlePlayerEnter(), OPvPCapturePointNA::HandlePlayerEnter(), OPvPCapturePointTF::HandlePlayerEnter(), OPvPCapturePointZM_Beacon::HandlePlayerEnter(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), OPvPCapturePointEP_EWT::HandlePlayerLeave(), OPvPCapturePointEP_NPT::HandlePlayerLeave(), OPvPCapturePointEP_CGT::HandlePlayerLeave(), OPvPCapturePointEP_PWT::HandlePlayerLeave(), OPvPCapturePointGH::HandlePlayerLeave(), OPvPCapturePointHP::HandlePlayerLeave(), OPvPCapturePointNA::HandlePlayerLeave(), OPvPCapturePointTF::HandlePlayerLeave(), OPvPCapturePointZM_Beacon::HandlePlayerLeave(), npc_wg_queue::OnGossipHello(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnPlayerEnter(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::OnPlayerEnter(), instance_oculus::instance_oculus_InstanceMapScript::OnPlayerEnter(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), OutdoorPvPEP::SendRemoveWorldStates(), OutdoorPvPGH::SendRemoveWorldStates(), OutdoorPvPHP::SendRemoveWorldStates(), OutdoorPvPNA::SendRemoveWorldStates(), OutdoorPvPSI::SendRemoveWorldStates(), OutdoorPvPTF::SendRemoveWorldStates(), OutdoorPvPZM::SendRemoveWorldStates(), and GameEventMgr::SendWorldStateUpdate().

◆ SetAcceptWhispers()

void Player::SetAcceptWhispers ( bool  on)
inline

◆ SetActiveSpec()

void Player::SetActiveSpec ( uint8  spec)
inline
1750{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2493{
2494 if (!item)
2495 return;
2496
2497 // already set
2498 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2499 return;
2500
2501 // check ammo
2502 InventoryResult msg = CanUseAmmo(item);
2503 if (msg != EQUIP_ERR_OK)
2504 {
2505 SendEquipError(msg, nullptr, nullptr, item);
2506 return;
2507 }
2508
2510
2512}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Unit::SetUInt32Value().

Referenced by Create(), and WorldSession::HandleSetAmmoOpcode().

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6297{
6298 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6299 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6301 if (value)
6303}
@ CONFIG_MAX_ARENA_POINTS
Definition IWorld.h:245
@ ITEM_ARENA_POINTS_ID
Definition Player.h:966

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2484{ m_auraRaidUpdateMask |= (uint64(1) << slot); }

References m_auraRaidUpdateMask.

◆ SetBankBagSlotCount()

void Player::SetBankBagSlotCount ( uint8  count)
inline

◆ SetBaseModValue()

void Player::SetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  value 
)
inline
2200{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2522{ m_runes->runes[index].BaseRune = baseRune; }

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by InitRunes().

◆ SetBattlegroundId()

◆ SetBattlegroundOrBattlefieldRaid()

void Player::SetBattlegroundOrBattlefieldRaid ( Group group,
int8  subgroup = -1 
)
13125{
13126 //we must move references from m_group to m_originalGroup
13127 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
13128 {
13129 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
13130 //ABORT(); // pussywizard: origanal group can never be bf/bg group
13131 }
13132
13134
13135 m_group.unlink();
13136 m_group.link(group, this);
13137 m_group.setSubGroup((uint8)subgroup);
13138}
uint8 GetSubGroup() const
Definition Player.h:2480

References GetGroup(), GetSubGroup(), Reference< TO, FROM >::link(), LOG_INFO, m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), and Battleground::AddOrSetPlayerToCorrectBgGroup().

◆ SetBGData()

void Player::SetBGData ( BGData bgdata)
inline
2268{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8910{
8912 data << guid;
8913 GetSession()->SendPacket(&data);
8914}
@ SMSG_BINDER_CONFIRM
Definition Opcodes.h:777

References GetSession(), WorldSession::SendPacket(), and SMSG_BINDER_CONFIRM.

Referenced by npc_innkeeper::OnGossipSelect(), and OnGossipSelect().

◆ SetBonusTalentCount()

void Player::SetBonusTalentCount ( uint32  count)
inline
1741{ m_extraBonusTalentCount = count; };

References m_extraBonusTalentCount.

◆ SetCanBlock()

void Player::SetCanBlock ( bool  value)
13175{
13176 if (m_canBlock == value)
13177 return;
13178
13179 m_canBlock = value;
13181}
void UpdateBlockPercentage()
Definition StatSystem.cpp:616

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanFly()

bool Player::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

movement counter

Reimplemented from Unit.

15957{
15958 sScriptMgr->AnticheatSetCanFlybyServer(this, apply);
15959
15960 if (!packetOnly && !Unit::SetCanFly(apply))
15961 return false;
15962
15963 if (!apply)
15965
15967 data << GetPackGUID();
15968 data << uint32(0);
15969 SendDirectMessage(&data);
15970
15972 data << GetPackGUID();
15973 BuildMovementPacket(&data);
15974 SendMessageToSet(&data, false);
15975 return true;
15976}
virtual bool SetCanFly(bool enable, bool packetOnly=false)
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Unit.cpp:20673
@ MSG_MOVE_UPDATE_CAN_FLY
Definition Opcodes.h:971
@ SMSG_MOVE_SET_CAN_FLY
Definition Opcodes.h:865
@ SMSG_MOVE_UNSET_CAN_FLY
Definition Opcodes.h:866

References Unit::BuildMovementPacket(), GameTime::GetGameTime(), Object::GetPackGUID(), Position::GetPositionZ(), WorldPacket::Initialize(), MSG_MOVE_UPDATE_CAN_FLY, SendDirectMessage(), SendMessageToSet(), Unit::SetCanFly(), SetFallInformation(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, and sScriptMgr.

Referenced by Unit::KnockbackFrom().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2508{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13166{
13167 if (m_canParry == value)
13168 return;
13169
13170 m_canParry = value;
13172}
void UpdateParryPercentage()
Definition StatSystem.cpp:735

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13184{
13185 m_canTitanGrip = value;
13186}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2559{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1843 {
1844 m_cinematic = cine;
1845 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12896{
12898 data << target->GetPackGUID();
12899 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12900 GetSession()->SendPacket(&data);
12901
12902 // We want to set the packet only
12903 if (packetOnly)
12904 return;
12905
12906 if (this != target)
12907 SetViewpoint(target, allowMove);
12908
12909 if (allowMove)
12910 SetMover(target);
12911
12912 // Xinef: disable moving if target has disable move flag
12913 if (!target->IsCreature())
12914 return;
12915
12916 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12917 {
12919 target->SetControlled(true, UNIT_STATE_ROOT);
12920 }
12921 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12922 {
12924 {
12925 // Xinef: restore original orientation, important for shooting vehicles!
12927 target->SetOrientation(pos.GetOrientation());
12928 target->SetFacingTo(pos.GetOrientation());
12929 target->DisableSpline();
12930 }
12931 else
12932 target->SetControlled(false, UNIT_STATE_ROOT);
12933 }
12934}
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:341
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:346
bool IsMOTransport() const
Definition ObjectGuid.h:175
void SetFacingTo(float ori)
Definition Unit.cpp:20593
void DisableSpline()
Definition Unit.cpp:636
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18100
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18822
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:712
@ SMSG_CLIENT_CONTROL_UPDATE
Definition Opcodes.h:375
void SetOrientation(float orientation)
Definition Position.h:111

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), GetSession(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), Object::IsCreature(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, WorldSession::SendPacket(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), UNIT_FLAG_DISABLE_MOVE, UNIT_MASK_ACCESSORY, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, and UNIT_STATE_ROOT.

Referenced by Battleground::BlockMovement(), WorldSession::HandleMoveTeleportAck(), npc_pilgrims_bounty_chair::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::SetCharmedBy(), Unit::SetConfused(), and Unit::SetFeared().

◆ SetCommandStatusOff()

◆ SetCommandStatusOn()

◆ SetCommentator()

void Player::SetCommentator ( bool  on)
inline

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1876{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCreationTime()

void Player::SetCreationTime ( Seconds  creationTime)
inline
2546{ m_creationTime = creationTime; }

References m_creationTime.

Referenced by LoadFromDB().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2523{ m_runes->runes[index].CurrentRune = currentRune; }

References RuneInfo::CurrentRune, m_runes, and Runes::runes.

Referenced by ConvertRune(), and InitRunes().

◆ SetCurrentTitle()

void Player::SetCurrentTitle ( CharTitlesEntry const *  title,
bool  clear = false 
)
inline
2552{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Unit::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
12128{
12129 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
12130 {
12131 if (!qQuest->IsDFQuest())
12132 {
12133 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12134 {
12135 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12136 {
12137 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12138 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12139 m_DailyQuestChanged = true;
12140 break;
12141 }
12142 }
12143 }
12144 else
12145 {
12146 m_DFQuests.insert(quest_id);
12148 m_DailyQuestChanged = true;
12149 }
12150 }
12151}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1016{
1017 uint32 ressSpellId = 0;
1018
1019 bool cur = IsAlive();
1020
1021 if (s == DeathState::JustDied)
1022 {
1023 if (!cur)
1024 {
1025 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1026 return;
1027 }
1028
1029 // clear all pending spell cast requests when dying
1030 SpellQueue.clear();
1031
1032 // drunken state is cleared on death
1033 SetDrunkValue(0);
1034 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1036
1038
1039 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DeathState::Dead) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1040 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1041
1042 // save value before aura remove in Unit::setDeathState
1044
1045 // xinef: disable passive area auras!
1047
1048 // passive spell
1049 if (!ressSpellId)
1050 ressSpellId = GetResurrectionSpellId();
1054
1055 // Xinef: reset all death criterias
1057 }
1058 // xinef: enable passive area auras!
1059 else if (s == DeathState::Alive)
1061
1063
1066
1067 // restore resurrection spell id for player after aura remove
1068 if (s == DeathState::JustDied && cur && ressSpellId)
1070
1071 if (IsAlive() && !cur)
1072 //clear aura case after resurrection by another way (spells will be applied before next death)
1074}
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition DBCEnums.h:135
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
uint32 GetResurrectionSpellId()
Definition Player.cpp:12649
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition Player.cpp:13971
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14619

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), Alive, Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), JustDied, LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Unit::SetUInt32Value(), SpellQueue, Position::ToString(), UNIT_STATE_ISOLATED, and UpdateAchievementCriteria().

Referenced by KillPlayer(), and ResurrectPlayer().

◆ SetDeveloper()

void Player::SetDeveloper ( bool  on)
inline

◆ SetDisableGravity()

bool Player::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15940{
15941 if (!packetOnly && !Unit::SetDisableGravity(disable))
15942 return false;
15943
15945 data << GetPackGUID();
15946 data << uint32(0);
15947 SendDirectMessage(&data);
15948
15950 data << GetPackGUID();
15951 BuildMovementPacket(&data);
15952 SendMessageToSet(&data, false);
15953 return true;
15954}
virtual bool SetDisableGravity(bool disable, bool packetOnly=false, bool updateAnimationTier=true)
Definition Unit.cpp:20630
@ SMSG_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1262
@ MSG_MOVE_GRAVITY_CHNG
Definition Opcodes.h:1264

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_GRAVITY_CHNG, SendDirectMessage(), SendMessageToSet(), Unit::SetDisableGravity(), SMSG_MOVE_GRAVITY_DISABLE, and SMSG_MOVE_GRAVITY_ENABLE.

Referenced by npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded().

◆ SetDivider()

◆ SetDrunkValue()

void Player::SetDrunkValue ( uint8  newDrunkValue,
uint32  itemId = 0 
)
973{
974 newDrunkValue = std::min<uint8>(newDrunkValue, 100);
975 if (newDrunkValue == GetDrunkValue())
976 return;
977
979 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
980
983
984 m_drunkTimer = 0; // reset sobering timer
985
986 if (newDrunkenState == oldDrunkenState)
987 return;
988
990 data.Guid = GetGUID();
991 data.Threshold = newDrunkenState;
992 data.ItemID = itemId;
993
994 SendMessageToSet(data.Write(), true);
995}
@ PLAYER_BYTES_3_OFFSET_INEBRIATION
Definition Player.h:534
void UpdateInvisibilityDrunkDetect()
Definition Player.cpp:997
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition Player.cpp:961
WorldPacket const * Write() override
Definition MiscPackets.cpp:113
ObjectGuid Guid
Definition MiscPackets.h:175
uint32 Threshold
Definition MiscPackets.h:176
uint32 ItemID
Definition MiscPackets.h:177

References GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, SendMessageToSet(), Object::SetByteValue(), WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateInvisibilityDrunkDetect(), and WorldPackets::Misc::CrossedInebriationThreshold::Write().

Referenced by Spell::EffectInebriate(), HandleSobering(), LoadFromDB(), and setDeathState().

◆ SetDungeonDifficulty()

void Player::SetDungeonDifficulty ( Difficulty  dungeon_difficulty)
inline

◆ SetEntryPoint()

void Player::SetEntryPoint ( )
11322{
11325
11326 if (!m_taxi.empty())
11327 {
11330
11333 }
11334 else
11335 {
11336 if (IsMounted())
11337 {
11339 if (!auras.empty())
11340 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11341 }
11342 else
11344
11345 if (GetMap()->IsDungeon())
11346 {
11347 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11348 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11349 }
11350 else if (!GetMap()->IsBattlegroundOrArena())
11352 }
11353
11356}
bool IsDungeon() const
Definition Map.h:446
bool IsBattlegroundOrArena() const
Definition Map.h:454
bool empty() const
Definition PlayerTaxi.h:73
uint32 GetTaxiDestination() const
Definition PlayerTaxi.h:64
uint32 m_mapId
Definition Position.h:318

References EntryPointData::ClearTaxiPath(), PlayerTaxi::empty(), Unit::GetAuraEffectsByType(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PlayerTaxi::GetTaxiDestination(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Map::IsBattlegroundOrArena(), Map::IsDungeon(), Unit::IsMounted(), EntryPointData::joinPos, m_entryPointData, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, WorldLocation::m_mapId, m_taxi, MAPID_INVALID, EntryPointData::mountSpell, sGraveyard, SPELL_AURA_MOUNTED, and EntryPointData::taxiPath.

Referenced by misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), and lfg::LFGMgr::TeleportPlayer().

◆ SetEquipmentSet()

void Player::SetEquipmentSet ( uint32  index,
EquipmentSet  eqset 
)
14544{
14545 if (eqset.Guid != 0)
14546 {
14547 bool found = false;
14548
14549 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14550 {
14551 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14552 {
14553 found = true;
14554 break;
14555 }
14556 }
14557
14558 if (!found) // something wrong...
14559 {
14560 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14561 return;
14562 }
14563 }
14564
14565 EquipmentSet& eqslot = m_EquipmentSets[index];
14566
14567 EquipmentSetUpdateState old_state = eqslot.state;
14568
14569 eqslot = eqset;
14570
14571 if (eqset.Guid == 0)
14572 {
14573 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14574
14576 data << uint32(index);
14577 data.appendPackGUID(eqslot.Guid);
14578 GetSession()->SendPacket(&data);
14579 }
14580
14582}
EquipmentSetUpdateState
Definition Player.h:746
@ SMSG_EQUIPMENT_SET_SAVED
Definition Opcodes.h:341

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_NEW, WorldObject::GetName(), GetSession(), EquipmentSet::Guid, LOG_ERROR, m_EquipmentSets, WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_SAVED, sObjectMgr, and EquipmentSet::state.

Referenced by WorldSession::HandleEquipmentSetSave().

◆ SetFactionForRace()

void Player::SetFactionForRace ( uint8  race)
5884{
5885 m_team = TeamIdForRace(race);
5886
5887 sScriptMgr->OnPlayerUpdateFaction(this);
5888
5889 if (GetTeamId(true) != GetTeamId())
5890 return;
5891
5892 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5893 SetFaction(rEntry ? rEntry->FactionID : 0);
5894}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition Unit.cpp:10110
Definition DBCStructure.h:678
uint32 FactionID
Definition DBCStructure.h:681

References ChrRacesEntry::FactionID, GetTeamId(), m_team, sChrRacesStore, Unit::SetFaction(), sScriptMgr, and TeamIdForRace().

Referenced by Create(), reset_commandscript::HandleResetStatsOrLevelHelper(), LoadFromDB(), InstanceScript::OnPlayerLeave(), Unit::RestoreFaction(), and SetGameMaster().

◆ SetFallInformation()

◆ SetFarSightDistance()

void Player::SetFarSightDistance ( float  radius)
16307{
16308 _farSightDistance = radius;
16309}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFeatherFall()

bool Player::SetFeatherFall ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

16021{
16022 // Xinef: moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
16023 if (!packetOnly/* && !Unit::SetFeatherFall(apply)*/)
16024 {
16025 Unit::SetFeatherFall(apply);
16026 //return false;
16027 }
16028
16030 data << GetPackGUID();
16031 data << uint32(0);
16032 SendDirectMessage(&data);
16033
16035 data << GetPackGUID();
16036 BuildMovementPacket(&data);
16037 SendMessageToSet(&data, false);
16038 return true;
16039}
virtual bool SetFeatherFall(bool enable, bool packetOnly=false)
Definition Unit.cpp:20717
@ SMSG_MOVE_FEATHER_FALL
Definition Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition Opcodes.h:273
@ MSG_MOVE_FEATHER_FALL
Definition Opcodes.h:718

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_FEATHER_FALL, SendDirectMessage(), SendMessageToSet(), Unit::SetFeatherFall(), SMSG_MOVE_FEATHER_FALL, and SMSG_MOVE_NORMAL_FALL.

◆ SetFreePrimaryProfessions()

void Player::SetFreePrimaryProfessions ( uint16  profs)
inline

◆ SetFreeTalentPoints()

void Player::SetFreeTalentPoints ( uint32  points)

◆ SetGameMaster()

void Player::SetGameMaster ( bool  on)
2230{
2231 if (on)
2232 {
2234 if (GetSession()->IsGMAccount())
2238
2239 if (Pet* pet = GetPet())
2240 {
2241 if (GetSession()->IsGMAccount())
2242 pet->SetFaction(FACTION_FRIENDLY);
2243 pet->getHostileRefMgr().setOnlineOfflineState(false);
2244 }
2246 {
2248 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2249 }
2251
2254
2255 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2257 }
2258 else
2259 {
2260 // restore phase
2261 uint32 newPhase = GetPhaseByAuras();
2262
2263 if (!newPhase)
2264 newPhase = PHASEMASK_NORMAL;
2265
2266 SetPhaseMask(newPhase, false);
2267
2268 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2272
2273 if (Pet* pet = GetPet())
2274 {
2275 pet->SetFaction(GetFaction());
2276 pet->getHostileRefMgr().setOnlineOfflineState(true);
2277 }
2278
2279 // restore FFA PvP Server state
2280 if (sWorld->IsFFAPvPRealm())
2281 {
2283 {
2285 sScriptMgr->OnFfaPvpStateUpdate(this, true);
2286 }
2287 }
2288 // restore FFA PvP area state, remove not allowed for GM mounts
2290
2293 }
2294
2296}
@ SEC_PLAYER
Definition Common.h:57
@ PHASEMASK_ANYWHERE
Definition Object.h:61
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1273
@ FACTION_FRIENDLY
Definition SharedDefines.h:201
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition UnitDefines.h:306
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:377
void ResetContestedPvP()
Definition Player.h:1877
void UpdateArea(uint32 newArea)
Definition PlayerUpdates.cpp:1210
uint32 GetFaction() const
Definition Unit.h:817
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19115
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10513
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition Object.h:529

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), m_areaUpdateId, m_ExtraFlags, WorldObject::m_serverSideVisibilityDetect, PHASEMASK_ANYWHERE, PHASEMASK_NORMAL, PLAYER_EXTRA_GM_ON, PLAYER_FLAGS_GM, Object::RemoveByteFlag(), RemovePlayerFlag(), Unit::RemoveUnitFlag2(), ResetContestedPvP(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, Object::SetByteFlag(), Unit::SetFaction(), SetFactionForRace(), HostileRefMgr::setOnlineOfflineState(), Unit::SetPhaseMask(), SetPlayerFlag(), Unit::SetUnitFlag2(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS, UpdateArea(), and UpdateObjectVisibility().

Referenced by gm_commandscript::HandleGMOffCommand(), gm_commandscript::HandleGMOnCommand(), and LoadFromDB().

◆ SetGlyph()

void Player::SetGlyph ( uint8  slot,
uint32  glyph,
bool  save 
)
inline
1767 {
1768 m_Glyphs[m_activeSpec][slot] = glyph;
1770
1771 if (save)
1772 SetNeedToSaveGlyphs(true);
1773 }
@ PLAYER_FIELD_GLYPHS_1
Definition UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Unit::SetUInt32Value().

Referenced by _LoadGlyphAuras(), ActivateSpec(), Spell::EffectApplyGlyph(), and WorldSession::HandleRemoveGlyph().

◆ SetGlyphSlot()

void Player::SetGlyphSlot ( uint8  slot,
uint32  slottype 
)
inline

◆ SetGMChat()

void Player::SetGMChat ( bool  on)
inline
1178{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by LoadFromDB().

◆ SetGMVisible()

void Player::SetGMVisible ( bool  on)
2299{
2300 const uint32 VISUAL_AURA = 37800;
2301
2302 if (on)
2303 {
2304 RemoveAurasDueToSpell(VISUAL_AURA);
2305 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2307
2310 }
2311 else
2312 {
2313 AddAura(VISUAL_AURA, this);
2316 }
2317}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:528

References Unit::AddAura(), Unit::CombatStopWithPets(), Unit::getHostileRefMgr(), GetSession(), m_ExtraFlags, WorldObject::m_serverSideVisibility, PLAYER_EXTRA_GM_INVISIBLE, Unit::RemoveAurasDueToSpell(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, HostileRefMgr::setOnlineOfflineState(), and FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue().

Referenced by gm_commandscript::HandleGMVisibleCommand(), and LoadFromDB().

◆ SetGracePeriod()

void Player::SetGracePeriod ( uint8  index,
uint32  period 
)
inline

◆ SetGrantableLevels()

void Player::SetGrantableLevels ( uint8  val)
inline

◆ SetGroup()

void Player::SetGroup ( Group group,
int8  subgroup = -1 
)
11601{
11602 if (!group)
11603 m_group.unlink();
11604 else
11605 {
11606 // never use SetGroup without a subgroup unless you specify nullptr for group
11607 ASSERT(subgroup >= 0);
11608 m_group.link(group, this);
11609 m_group.setSubGroup((uint8)subgroup);
11610 }
11611
11613}

References ASSERT, Reference< TO, FROM >::link(), m_group, GroupReference::setSubGroup(), Reference< TO, FROM >::unlink(), and UpdateObjectVisibility().

Referenced by _LoadGroup(), Group::AddMember(), Group::Disband(), and Group::RemoveMember().

◆ SetGroupInvite()

void Player::SetGroupInvite ( Group group)
inline

◆ SetGroupUpdateFlag()

◆ SetGuildIdInvited()

void Player::SetGuildIdInvited ( uint32  GuildId)
inline

◆ SetHas310Flyer()

void Player::SetHas310Flyer ( bool  on)
inline
1184{ if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }

References m_ExtraFlags, and PLAYER_EXTRA_HAS_310_FLYER.

Referenced by _addSpell(), and Has310Flyer().

◆ SetHasDelayedTeleport()

void Player::SetHasDelayedTeleport ( bool  setting)
inlineprivate
2956{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4897{
4898 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
4899 m_homebindMapId = loc.GetMapId();
4900 m_homebindAreaId = areaId;
4901
4902 // update sql homebind
4904 stmt->SetData(0, m_homebindMapId);
4905 stmt->SetData(1, m_homebindAreaId);
4906 stmt->SetData (2, m_homebindX);
4907 stmt->SetData (3, m_homebindY);
4908 stmt->SetData (4, m_homebindZ);
4909 stmt->SetData(5, GetGUID().GetCounter());
4910 CharacterDatabase.Execute(stmt);
4911}
@ CHAR_UPD_PLAYER_HOMEBIND
Definition CharacterDatabase.h:241

References CHAR_UPD_PLAYER_HOMEBIND, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPosition(), m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6276{
6277 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6278 {
6279 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6280 {
6281 // Only convert points on login, not when awarded honor points.
6282 if (isBeingLoaded())
6283 {
6284 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6285 ModifyMoney(excessPoints * copperPerPoint);
6286 }
6287 }
6288
6289 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6290 }
6292 if (value)
6294}
@ CONFIG_MAX_HONOR_POINTS
Definition IWorld.h:242
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition IWorld.h:243
@ ITEM_HONOR_POINTS_ID
Definition Player.h:965

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), reset_commandscript::HandleResetHonorCommand(), LoadFromDB(), and ModifyHonorPoints().

◆ SetHover()

bool Player::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15979{
15980 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15981 if (!packetOnly /* && !Unit::SetHover(apply)*/)
15982 {
15983 Unit::SetHover(apply);
15984 // return false;
15985 }
15986
15988 data << GetPackGUID();
15989 data << uint32(0);
15990 SendDirectMessage(&data);
15991
15992 data.Initialize(MSG_MOVE_HOVER, 64);
15993 data << GetPackGUID();
15994 BuildMovementPacket(&data);
15995 SendMessageToSet(&data, false);
15996 return true;
15997}
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition Unit.cpp:20739
@ MSG_MOVE_HOVER
Definition Opcodes.h:277
@ SMSG_MOVE_SET_HOVER
Definition Opcodes.h:274
@ SMSG_MOVE_UNSET_HOVER
Definition Opcodes.h:275

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_HOVER, SendDirectMessage(), SendMessageToSet(), Unit::SetHover(), SMSG_MOVE_SET_HOVER, and SMSG_MOVE_UNSET_HOVER.

◆ SetInArenaTeam()

void Player::SetInArenaTeam ( uint32  ArenaTeamId,
uint8  slot,
uint8  type 
)
inline
1915 {
1916 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1918 }

References ARENA_TEAM_ID, ARENA_TEAM_TYPE, and SetArenaTeamInfoField().

Referenced by ArenaTeam::AddMember().

◆ SetInGameTime()

void Player::SetInGameTime ( uint32  time)
inline

◆ SetInGuild()

void Player::SetInGuild ( uint32  GuildId)
inline

◆ SetInviteForBattlegroundQueueType()

void Player::SetInviteForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId,
uint32  instanceId 
)
12319{
12320 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12321 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12322 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12323}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2187{
2188 if (m_isInWater == apply)
2189 return;
2190
2191 //define player in water by opcodes
2192 //move player's guid into HateOfflineList of those mobs
2193 //which can't swim and move guid back into ThreatList when
2194 //on surface.
2195 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2197
2198 // remove auras that need water/land
2200
2202
2203 if (InstanceScript* instance = GetInstanceScript())
2204 instance->OnPlayerInWaterStateUpdate(this, apply);
2205}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void updateThreatTables()
Definition HostileRefMgr.cpp:111

References AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, Unit::getHostileRefMgr(), WorldObject::GetInstanceScript(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::HandleMovementOpcodes().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15393{
15394 if (on)
15395 {
15399 //SetFaction(1100);
15402 {
15404 sScriptMgr->OnFfaPvpStateUpdate(this, false);
15405 }
15407 SetDisplayId(23691);
15408 }
15409 else
15410 {
15412 if (IsSpectator())
15414 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15417
15418 if (!IsGameMaster())
15419 {
15420 //SetFactionForRace(getRace());
15421
15422 // restore FFA PvP Server state
15423 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15424 if (sWorld->IsFFAPvPRealm())
15425 {
15427 {
15429 sScriptMgr->OnFfaPvpStateUpdate(this, true);
15430
15431 }
15432 }
15433 }
15434 }
15435}
#define SPECTATOR_SPELL_SPEED
Definition ArenaSpectator.h:39
void RestoreDisplayId()
Definition Unit.cpp:16841

References Unit::AddAura(), Unit::AddUnitState(), Unit::ClearUnitState(), Object::HasByteFlag(), IsGameMaster(), IsSpectator(), m_ExtraFlags, PLAYER_EXTRA_SPECTATOR_ON, Unit::RemoveAurasDueToSpell(), Object::RemoveByteFlag(), Unit::RemoveUnitFlag(), ResetContestedPvP(), Unit::RestoreDisplayId(), Object::SetByteFlag(), Unit::SetDisplayId(), Unit::SetUnitFlag(), SPECTATOR_SPELL_SPEED, sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, and UNIT_STATE_ISOLATED.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetLastPetNumber()

void Player::SetLastPetNumber ( uint32  petnumber)
inline
2466{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2468{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by Pet::LoadPetFromDB(), and UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1820{ m_lastPotionId = item_id; }

References m_lastPotionId.

Referenced by Spell::SendSpellCooldown(), and UpdatePotionCooldown().

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2521{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
2001{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14713{
14714 Unit::SetMap(map);
14715 m_mapRef.link(map, this);
14716}
virtual void SetMap(Map *map)
Definition Object.cpp:2116

References Reference< TO, FROM >::link(), m_mapRef, and WorldObject::SetMap().

Referenced by Map::AddPlayerToMap(), Create(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), and LoadFromDB().

◆ SetMoney()

void Player::SetMoney ( uint32  value)
inline

◆ SetMonthlyQuestStatus()

void Player::SetMonthlyQuestStatus ( uint32  quest_id)
12186{
12187 m_monthlyquests.insert(quest_id);
12188 m_MonthlyQuestChanged = true;
12189}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4414{
4415 WorldPacket data;
4416 switch (pType)
4417 {
4418 case MOVE_ROOT:
4419 data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
4420 break;
4421 case MOVE_UNROOT:
4422 data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
4423 break;
4424 case MOVE_WATER_WALK:
4425 data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4);
4426 break;
4427 case MOVE_LAND_WALK:
4428 data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
4429 break;
4430 default:
4431 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4432 return;
4433 }
4434 data << GetPackGUID();
4435 data << uint32(0);
4436 GetSession()->SendPacket(&data);
4437}
@ SMSG_MOVE_LAND_WALK
Definition Opcodes.h:253
@ SMSG_MOVE_WATER_WALK
Definition Opcodes.h:252
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264

References Object::GetPackGUID(), GetSession(), WorldPacket::Initialize(), LOG_ERROR, MOVE_LAND_WALK, MOVE_ROOT, MOVE_UNROOT, MOVE_WATER_WALK, WorldSession::SendPacket(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), WorldSession::HandlePlayerLoginFromDB(), cheat_commandscript::HandleWaterWalkCheatCommand(), KillPlayer(), ResurrectPlayer(), and SendInitialPacketsAfterAddToMap().

◆ SetMover()

void Player::SetMover ( Unit target)
12937{
12938 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12939 {
12940 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12941 LOG_INFO("misc", "Player::SetMover (A2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12942 LOG_INFO("misc", "Player::SetMover (A3) - {}, {}, {}, {}, {}, {}, {}, {}", target->m_movedByPlayer->GetGUID().ToString(), target->m_movedByPlayer->GetMapId(), target->m_movedByPlayer->GetInstanceId(), target->m_movedByPlayer->FindMap()->GetId(), target->m_movedByPlayer->IsInWorld() ? 1 : 0, target->m_movedByPlayer->IsDuringRemoveFromWorld() ? 1 : 0, target->m_movedByPlayer->ToPlayer()->IsBeingTeleported() ? 1 : 0, target->m_movedByPlayer->isBeingLoaded() ? 1 : 0);
12943 }
12944 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12945 {
12946 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12947 LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12948 }
12949 m_mover->m_movedByPlayer = nullptr;
12950 if (m_mover->IsCreature())
12952
12953 m_mover = target;
12954 m_mover->m_movedByPlayer = this;
12955 if (m_mover->IsCreature())
12957}
void Initialize()
Definition MotionMaster.cpp:73
bool IsDuringRemoveFromWorld() const
Definition Unit.h:674

References WorldObject::FindMap(), Object::GetGUID(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Object::IsCreature(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), and Position::ToString().

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2954{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2610{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1867{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1096 {
1097 Unit::SetObjectScale(scale);
1100 }
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:45
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:46
@ UNIT_FIELD_COMBATREACH
Definition UpdateFields.h:123
@ UNIT_FIELD_BOUNDINGRADIUS
Definition UpdateFields.h:122
virtual void SetObjectScale(float scale)
Definition Object.h:119

References DEFAULT_COMBAT_REACH, DEFAULT_WORLD_OBJECT_SIZE, Object::SetFloatValue(), Object::SetObjectScale(), UNIT_FIELD_BOUNDINGRADIUS, and UNIT_FIELD_COMBATREACH.

Referenced by Create(), InitStatsForLevel(), and LoadFromDB().

◆ SetOriginalGroup()

void Player::SetOriginalGroup ( Group group,
int8  subgroup = -1 
)
13153{
13154 if (!group)
13156 else
13157 {
13158 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13159 ASSERT(subgroup >= 0);
13160 m_originalGroup.link(group, this);
13162 }
13163}

References ASSERT, Reference< TO, FROM >::link(), m_originalGroup, GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Group::Disband(), RemoveFromBattlegroundOrBattlefieldRaid(), Group::RemoveMember(), and SetBattlegroundOrBattlefieldRaid().

◆ SetPassOnGroupLoot()

void Player::SetPassOnGroupLoot ( bool  bPassOnGroupLoot)
inline
2496{ m_bPassOnGroupLoot = bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by WorldSession::HandleOptOutOfLootOpcode().

◆ SetPendingBind()

void Player::SetPendingBind ( uint32  instanceId,
uint32  bindTimer 
)
inline

◆ SetPendingSpectatorForBG()

void Player::SetPendingSpectatorForBG ( uint32  bgInstanceId)
inline

◆ SetPendingSpectatorInviteInstanceId()

void Player::SetPendingSpectatorInviteInstanceId ( uint32  bgInstanceId)
inline

◆ SetPlayerFlag()

◆ SetPvP()

void Player::SetPvP ( bool  state)
inline
1858 {
1859 Unit::SetPvP(state);
1860 if (!m_Controlled.empty())
1861 for (auto& itr : m_Controlled)
1862 itr->SetPvP(state);
1863 }
void SetPvP(bool state)
Definition Player.h:1857
ControlSet m_Controlled
Definition Unit.h:1990
void SetPvP(bool state)
Definition Unit.h:992

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1185{ if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }

References m_ExtraFlags, and PLAYER_EXTRA_PVP_DEATH.

Referenced by CreateCorpse().

◆ SetQuestSlot()

◆ SetQuestSlotCounter()

void Player::SetQuestSlotCounter ( uint16  slot,
uint8  counter,
uint16  count 
)
inline

◆ SetQuestSlotState()

void Player::SetQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ SetQuestSlotTimer()

void Player::SetQuestSlotTimer ( uint16  slot,
uint32  timer 
)
inline

◆ SetQuestStatus()

void Player::SetQuestStatus ( uint32  questId,
QuestStatus  status,
bool  update = true 
)
1480{
1481 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1482 {
1483 m_QuestStatus[questId].Status = status;
1484
1485 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1486 {
1487 m_QuestStatusSave[questId] = true;
1488 }
1489 }
1490
1491 if (update)
1492 SendQuestUpdate(questId);
1493}

References m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), and sObjectMgr.

Referenced by CompleteQuest(), FailQuest(), IncompleteQuest(), and npc_finklestein::npc_finklesteinAI::RightClickCauldron().

◆ SetRaidDifficulty()

void Player::SetRaidDifficulty ( Difficulty  raid_difficulty)
inline

◆ SetRandomWinner()

void Player::SetRandomWinner ( bool  isWinner)
15743{
15744 m_IsBGRandomWinner = isWinner;
15746 {
15748 stmt->SetData(0, GetGUID().GetCounter());
15749 CharacterDatabase.Execute(stmt);
15750 }
15751}
@ CHAR_INS_BATTLEGROUND_RANDOM
Definition CharacterDatabase.h:64

References CHAR_INS_BATTLEGROUND_RANDOM, CharacterDatabase, Object::GetGUID(), m_IsBGRandomWinner, and PreparedStatementBase::SetData().

◆ SetRank()

void Player::SetRank ( uint8  rankId)
inline

◆ setRegenTimerCount()

void Player::setRegenTimerCount ( uint32  time)
inline
1613{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5315{
5316 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5317 {
5318 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5319 if (tmpitem && !tmpitem->IsBroken())
5320 {
5321 ItemTemplate const* proto = tmpitem->GetTemplate();
5322 if (proto->Delay)
5324 }
5325 else
5326 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5327 }
5328}

References BASE_ATTACK_TIME, ItemTemplate::Delay, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), MAX_ATTACK, and Unit::SetAttackTime().

Referenced by InitDataForForm().

◆ SetReputation()

void Player::SetReputation ( uint32  factionentry,
float  value 
)
15371{
15372 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15373}
bool SetReputation(FactionEntry const *factionEntry, float standing)
Definition ReputationMgr.h:113

References GetReputationMgr(), ReputationMgr::SetReputation(), and sFactionStore.

◆ SetRestBonus()

void Player::SetRestBonus ( float  restBonusNew)
10237{
10238 // Prevent resting on max level
10239 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10240 restBonusNew = 0;
10241
10242 if (restBonusNew < 0)
10243 restBonusNew = 0;
10244
10245 // Fetch rest bonus multiplier from cached configuration
10246 float restBonusMultiplier = sWorld->getRate(RATE_REST_MAX_BONUS);
10247
10248 // Calculate rest bonus max using the multiplier
10249 float restBonusMax = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * restBonusMultiplier / 2;
10250
10251 if (restBonusNew > restBonusMax)
10252 _restBonus = restBonusMax;
10253 else
10254 _restBonus = restBonusNew;
10255 // update data for client
10256 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10258 else
10259 {
10260 if (_restBonus > 10)
10262 else if (_restBonus <= 1)
10264 }
10265
10266 //RestTickUpdate
10268}
@ RATE_REST_MAX_BONUS
Definition IWorld.h:505
@ REST_STATE_RESTED
Definition Player.h:989
@ PLAYER_REST_STATE_EXPERIENCE
Definition UpdateFields.h:358

References _restBonus, CONFIG_MAX_PLAYER_LEVEL, Unit::GetLevel(), GetSession(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), PLAYER_BYTES_2, PLAYER_NEXT_LEVEL_XP, PLAYER_REST_STATE_EXPERIENCE, RATE_REST_MAX_BONUS, REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, REST_STATE_RESTED, Object::SetByteValue(), Unit::SetUInt32Value(), and sWorld.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16187{
16188 uint32 oldRestMask = _restFlagMask;
16189 _restFlagMask |= restFlag;
16190
16191 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16192 {
16193 _restTime = GameTime::GetGameTime().count();
16195 }
16196
16197 if (triggerId)
16198 _innTriggerId = triggerId;
16199}

References _innTriggerId, _restFlagMask, _restTime, GameTime::GetGameTime(), PLAYER_FLAGS_RESTING, and SetPlayerFlag().

Referenced by WorldSession::HandleAreaTriggerOpcode(), LoadFromDB(), UpdateArea(), and UpdateZone().

◆ SetRestState()

void Player::SetRestState ( uint32  triggerId)

◆ setResurrectRequestData()

void Player::setResurrectRequestData ( ObjectGuid  guid,
uint32  mapId,
float  X,
float  Y,
float  Z,
uint32  health,
uint32  mana 
)
inline

◆ SetRewardedQuest()

void Player::SetRewardedQuest ( uint32  quest_id)
881{
882 m_RewardedQuests.insert(quest_id);
883 m_RewardedQuestsSave[quest_id] = true;
884}

References m_RewardedQuests, and m_RewardedQuestsSave.

Referenced by Spell::EffectQuestComplete(), and RewardQuest().

◆ SetRuneConvertAura()

void Player::SetRuneConvertAura ( uint8  index,
AuraEffect const *  aura 
)
inline

◆ SetRuneCooldown()

void Player::SetRuneCooldown ( uint8  index,
uint32  cooldown 
)
inline

◆ setRuneWeaponGUID()

void Player::setRuneWeaponGUID ( ObjectGuid  guid)
inline
2600{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2364{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12176{
12177 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12178 if (!quest)
12179 return;
12180
12181 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12183}
uint16 GetEventIdForQuest() const
Definition QuestDef.h:332

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2357{ m_seer = target; }

References m_seer.

Referenced by WorldSession::HandleFarSightOpcode(), and SetViewpoint().

◆ SetSelection()

void Player::SetSelection ( ObjectGuid  guid)

Used for serverside target changes, does not apply to players.

11593{
11595
11598}
void SendCommand_GUID(T *o, ObjectGuid targetGUID, const char *prefix, ObjectGuid t)
Definition ArenaSpectator.h:71

References WorldObject::FindMap(), Object::GetGUID(), NeedSendSpectatorData(), ArenaSpectator::SendCommand_GUID(), Object::SetGuidValue(), and UNIT_FIELD_TARGET.

Referenced by WorldSession::HandleSetSelectionOpcode(), and TeleportTo().

◆ SetSemaphoreTeleportFar()

void Player::SetSemaphoreTeleportFar ( time_t  tm)
inline

◆ SetSemaphoreTeleportNear()

void Player::SetSemaphoreTeleportNear ( time_t  tm)
inline

◆ SetServerSideVisibility()

void Player::SetServerSideVisibility ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16293{
16294 sScriptMgr->OnSetServerSideVisibility(this, type, sec);
16295
16297}

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16300{
16301 sScriptMgr->OnSetServerSideVisibilityDetect(this, type, sec);
16302
16304}

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
2006{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

98{
99 switch (sheathed)
100 {
101 case SHEATH_STATE_UNARMED: // no prepared weapon
102 SetVirtualItemSlot(0, nullptr);
103 SetVirtualItemSlot(1, nullptr);
104 SetVirtualItemSlot(2, nullptr);
105 break;
106 case SHEATH_STATE_MELEE: // prepared melee weapon
109 SetVirtualItemSlot(2, nullptr);
110 break;
111 case SHEATH_STATE_RANGED: // prepared ranged weapon
112 SetVirtualItemSlot(0, nullptr);
113 SetVirtualItemSlot(1, nullptr);
115 break;
116 default:
117 SetVirtualItemSlot(0, nullptr);
118 SetVirtualItemSlot(1, nullptr);
119 SetVirtualItemSlot(2, nullptr);
120 break;
121 }
122 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
123}
@ SHEATH_STATE_UNARMED
Definition UnitDefines.h:126
@ SHEATH_STATE_MELEE
Definition UnitDefines.h:127
@ SHEATH_STATE_RANGED
Definition UnitDefines.h:128
void SetVirtualItemSlot(uint8 i, Item *item)
Definition PlayerStorage.cpp:77
virtual void SetSheath(SheathState sheathed)
Definition Unit.h:1692

References BASE_ATTACK, GetWeaponForAttack(), OFF_ATTACK, RANGED_ATTACK, Unit::SetSheath(), SetVirtualItemSlot(), SHEATH_STATE_MELEE, SHEATH_STATE_RANGED, and SHEATH_STATE_UNARMED.

Referenced by WorldSession::HandleSetSheathedOpcode().

◆ SetShowDKPet()

void Player::SetShowDKPet ( bool  on)
inline

◆ SetSkill()

void Player::SetSkill ( uint16  id,
uint16  step,
uint16  currVal,
uint16  maxVal 
)
5351{
5352 if (!id)
5353 return;
5354
5355 uint16 currVal;
5356 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5357
5358 //has skill
5359 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5360 {
5361 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5362 if (newVal)
5363 {
5364 // if skill value is going down, update enchantments before setting the new value
5365 if (newVal < currVal)
5366 UpdateSkillEnchantments(id, currVal, newVal);
5367 // update step
5368 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5369 // update value
5370 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5371 if (itr->second.uState != SKILL_NEW)
5372 itr->second.uState = SKILL_CHANGED;
5373 learnSkillRewardedSpells(id, newVal);
5374 // if skill value is going up, update enchantments after setting the new value
5375 if (newVal > currVal)
5376 UpdateSkillEnchantments(id, currVal, newVal);
5379 }
5380 else //remove
5381 {
5382 //remove enchantments needing this skill
5383 UpdateSkillEnchantments(id, currVal, 0);
5384 // clear skill fields
5385 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5386 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5387 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5388
5389 // mark as deleted or simply remove from map if not saved yet
5390 if (itr->second.uState != SKILL_NEW)
5391 itr->second.uState = SKILL_DELETED;
5392 else
5393 mSkillStatus.erase(itr);
5394
5395 // remove all spells that related to this skill
5397 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5398 }
5399 }
5400 else if (newVal) //add
5401 {
5402 currVal = 0;
5403 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5405 {
5406 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5407 if (!pSkill)
5408 {
5409 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5410 return;
5411 }
5412
5415 UpdateSkillEnchantments(id, currVal, newVal);
5416
5417 // insert new entry or update if not deleted old entry yet
5418 if (itr != mSkillStatus.end())
5419 {
5420 itr->second.pos = i;
5421 itr->second.uState = SKILL_CHANGED;
5422 }
5423 else
5424 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5425
5426 // apply skill bonuses
5428
5429 // temporary bonuses
5431 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5432 if ((*j)->GetMiscValue() == int32(id))
5433 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5434
5435 // permanent bonuses
5437 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5438 if ((*j)->GetMiscValue() == int32(id))
5439 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5440
5441 // Learn all spells for skill
5442 learnSkillRewardedSpells(id, newVal);
5445 return;
5446 }
5447 }
5448}
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition DBCEnums.h:154
@ SPELL_AURA_MOD_SKILL
Definition SpellAuraDefines.h:93
@ SPELL_AURA_MOD_SKILL_TALENT
Definition SpellAuraDefines.h:161
@ AURA_EFFECT_HANDLE_SKILL
Definition SpellAuraDefines.h:47
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition PlayerStorage.cpp:4681

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), GetSkillLineAbilitiesBySkillLine(), Object::GetUInt32Value(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, removeSpell(), Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1752{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
10115{
10116 if (apply && m_spellModTakingSpell)
10117 {
10118 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10119 return;
10120 //ASSERT(m_spellModTakingSpell == nullptr);
10121 }
10122 else if (!apply)
10123 {
10125 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
10126 else if (m_spellModTakingSpell != spell)
10127 {
10128 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10129 return;
10130 }
10131 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
10132 }
10133
10134 m_spellModTakingSpell = apply ? spell : nullptr;
10135}

References SpellInfo::Id, LOG_INFO, Spell::m_spellInfo, and m_spellModTakingSpell.

Referenced by Spell::_cast(), Spell::cast(), Spell::handle_delayed(), Unit::HandleDummyAuraProc(), and Aura::UpdateOwner().

◆ SetSummonAsSpectator()

void Player::SetSummonAsSpectator ( bool  on)
inline

◆ SetSummonPoint()

void Player::SetSummonPoint ( uint32  mapid,
float  x,
float  y,
float  z,
uint32  delay = 0,
bool  asSpectator = false 
)
16355{
16356 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16357 m_summon_mapid = mapid;
16358 m_summon_x = x;
16359 m_summon_y = y;
16360 m_summon_z = z;
16361 m_summon_asSpectator = asSpectator;
16362}
#define MAX_PLAYER_SUMMON_DELAY
Definition Player.h:934

References GameTime::GetGameTime(), m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, and MAX_PLAYER_SUMMON_DELAY.

Referenced by Spell::EffectSummonPlayer(), and Spell::EffectSummonRaFFriend().

◆ SetTarget()

void Player::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
inlineoverridevirtual

Implements Unit.

1646{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2118{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13376{
13377 uint32 fieldIndexOffset = title->bit_index / 32;
13378 uint32 flag = 1 << (title->bit_index % 32);
13379
13380 if (lost)
13381 {
13382 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13383 return;
13384
13385 // Clear the current title if it is the one being removed.
13386 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13387 {
13388 SetCurrentTitle(nullptr, true);
13389 }
13390
13391 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13392 }
13393 else
13394 {
13395 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13396 return;
13397
13398 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13399 }
13400
13401 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13402 data << uint32(title->bit_index);
13403 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13404 GetSession()->SendPacket(&data);
13405
13407}
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition DBCEnums.h:158
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition Player.h:2552
@ SMSG_TITLE_EARNED
Definition Opcodes.h:913

References ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, CharTitlesEntry::bit_index, GetSession(), Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), WorldSession::SendPacket(), SetCurrentTitle(), Object::SetFlag(), SMSG_TITLE_EARNED, and UpdateAchievementCriteria().

Referenced by _LoadQuestStatusRewarded(), AchievementMgr::CompletedAchievement(), titles_commandscript::HandleTitlesAddCommand(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), AchievementMgr::LoadFromDB(), and RewardQuest().

◆ SetViewpoint()

void Player::SetViewpoint ( WorldObject target,
bool  apply 
)
13210{
13211 if (apply)
13212 {
13213 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13214
13215 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13216 {
13217 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13218 return;
13219 }
13220
13221 // farsight dynobj or puppet may be very far away
13222 UpdateVisibilityOf(target);
13223
13224 if (target->IsUnit() && !GetVehicle())
13225 ((Unit*)target)->AddPlayerToVision(this);
13226 SetSeer(target);
13227 }
13228 else
13229 {
13230 //must immediately set seer back otherwise may crash
13231 m_seer = this;
13232
13233 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13234
13235 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13236 {
13237 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13238 return;
13239 }
13240
13241 if (target->IsUnit() && !GetVehicle())
13242 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13243
13244 // must immediately set seer back otherwise may crash
13245 SetSeer(this);
13246
13247 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13248 //GetSession()->SendPacket(&data);
13249 }
13250}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:704
void SetSeer(WorldObject *target)
Definition Player.h:2357
void UpdateVisibilityOf(WorldObject *target)
Definition PlayerUpdates.cpp:1709

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::IsUnit(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), and UpdateVisibilityOf().

Referenced by CinematicMgr::BeginCinematic(), CinematicMgr::EndCinematic(), AuraEffect::HandleBindSight(), WorldSession::HandleFarSightOpcode(), RemoveFromWorld(), and SetClientControl().

◆ SetVirtualItemSlot()

void Player::SetVirtualItemSlot ( uint8  i,
Item item 
)
Todo:
: this import is not necessary for compilation and marked as unused by the IDE
78{
79 ASSERT(i < 3);
80 if (i < 2 && item)
81 {
83 return;
85 if (charges == 0)
86 return;
87 if (charges > 1)
89 else if (charges <= 1)
90 {
93 }
94 }
95}

References ApplyEnchantment(), ASSERT, Item::ClearEnchantment(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Item::SetEnchantmentCharges(), and TEMP_ENCHANTMENT_SLOT.

Referenced by SetSheath().

◆ SetVisibleItemSlot()

void Player::SetVisibleItemSlot ( uint8  slot,
Item pItem 
)

◆ SetWaterWalking()

bool Player::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

movement counter

Reimplemented from Unit.

16000{
16001 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
16002 if (!packetOnly /* && !Unit::SetWaterWalking(apply)*/)
16003 {
16004 Unit::SetWaterWalking(apply);
16005 // return false;
16006 }
16007
16009 data << GetPackGUID();
16010 data << uint32(0);
16011 SendDirectMessage(&data);
16012
16014 data << GetPackGUID();
16015 BuildMovementPacket(&data);
16016 SendMessageToSet(&data, false);
16017 return true;
16018}
virtual bool SetWaterWalking(bool enable, bool packetOnly=false)
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition Unit.cpp:20695
@ MSG_MOVE_WATER_WALK
Definition Opcodes.h:719

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_WATER_WALK, SendDirectMessage(), SendMessageToSet(), Unit::SetWaterWalking(), SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), and ResurrectPlayer().

◆ setWeaponChangeTimer()

void Player::setWeaponChangeTimer ( uint32  time)
inline
1614{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12170{
12171 m_weeklyquests.insert(quest_id);
12172 m_WeeklyQuestChanged = true;
12173}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4709{
4711 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4712 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4713 {
4714 // prevent loading as ghost without corpse
4715 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4716
4717 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4719 stmt->SetData(0, GetGUID().GetCounter());
4720 trans->Append(stmt);
4721
4722 _SaveAuras(trans, false);
4723
4724 CharacterDatabase.CommitTransaction(trans);
4725 }
4726}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition CharacterDatabase.h:429

References _corpseLocation, _SaveAuras(), CHAR_UPD_CHAR_REMOVE_GHOST, CharacterDatabase, Object::GetGUID(), WorldObject::GetMap(), GetSession(), PreparedStatementBase::SetData(), and WorldLocation::WorldRelocate().

Referenced by Battleground::_ProcessResurrect(), CreateCorpse(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ SplitItem()

void Player::SplitItem ( uint16  src,
uint16  dst,
uint32  count 
)

If trading

If current item is in trade window (only possible with packet spoofing - silent return)

3422{
3423 uint8 srcbag = src >> 8;
3424 uint8 srcslot = src & 255;
3425
3426 uint8 dstbag = dst >> 8;
3427 uint8 dstslot = dst & 255;
3428
3429 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3430 if (!pSrcItem)
3431 {
3432 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3433 return;
3434 }
3435
3436 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3437 {
3438 //best error message found for attempting to split while looting
3440 return;
3441 }
3442
3443 // not let split all items (can be only at cheating)
3444 if (pSrcItem->GetCount() == count)
3445 {
3447 return;
3448 }
3449
3450 // not let split more existed items (can be only at cheating)
3451 if (pSrcItem->GetCount() < count)
3452 {
3454 return;
3455 }
3456
3458 if (TradeData* tradeData = GetTradeData())
3459 {
3461 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3462 return;
3463 }
3464
3465 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3466 Item* pNewItem = pSrcItem->CloneItem(count, this);
3467 if (!pNewItem)
3468 {
3469 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3470 return;
3471 }
3472
3473 if (IsInventoryPos(dst))
3474 {
3475 // change item amount before check (for unique max count check)
3476 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3477
3478 ItemPosCountVec dest;
3479 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3480 if (msg != EQUIP_ERR_OK)
3481 {
3482 delete pNewItem;
3483 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3484 SendEquipError(msg, pSrcItem, nullptr);
3485 return;
3486 }
3487
3488 if (IsInWorld())
3489 pSrcItem->SendUpdateToPlayer(this);
3490 pSrcItem->SetState(ITEM_CHANGED, this);
3491 StoreItem(dest, pNewItem, true);
3492 }
3493 else if (IsBankPos(dst))
3494 {
3495 // change item amount before check (for unique max count check)
3496 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3497
3498 ItemPosCountVec dest;
3499 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3500 if (msg != EQUIP_ERR_OK)
3501 {
3502 delete pNewItem;
3503 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3504 SendEquipError(msg, pSrcItem, nullptr);
3505 return;
3506 }
3507
3508 if (IsInWorld())
3509 pSrcItem->SendUpdateToPlayer(this);
3510 pSrcItem->SetState(ITEM_CHANGED, this);
3511 BankItem(dest, pNewItem, true);
3512 }
3513 else if (IsEquipmentPos(dst))
3514 {
3515 // change item amount before check (for unique max count check), provide space for splitted items
3516 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3517
3518 uint16 dest;
3519 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3520 if (msg != EQUIP_ERR_OK)
3521 {
3522 delete pNewItem;
3523 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3524 SendEquipError(msg, pSrcItem, nullptr);
3525 return;
3526 }
3527
3528 if (IsInWorld())
3529 pSrcItem->SendUpdateToPlayer(this);
3530 pSrcItem->SetState(ITEM_CHANGED, this);
3531 EquipItem(dest, pNewItem, true);
3533 }
3534}
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition Item.h:74
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition Item.h:73
@ TRADE_SLOT_INVALID
Definition TradeData.h:32
TradeData * GetTradeData() const
Definition Player.h:1387
Definition TradeData.h:36

References AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), Item::CloneItem(), EQUIP_ERR_COULDNT_SPLIT_ITEMS, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, EquipItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetTradeData(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), ITEM_CHANGED, LOG_DEBUG, Item::m_lootGenerated, SendEquipError(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), and TRADE_SLOT_INVALID.

Referenced by WorldSession::HandleSplitItemOpcode().

◆ StartTimedAchievement()

void Player::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
13962{
13963 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13964}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition AchievementMgr.cpp:2226

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), InstanceScript::DoStartTimedAchievement(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13197{
13198 if (WorldObject* target = GetViewpoint())
13199 {
13200 if (target->IsUnit())
13201 {
13202 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13203 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13204 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13205 }
13206 }
13207}
@ SPELL_AURA_MOD_POSSESS_PET
Definition SpellAuraDefines.h:191
@ SPELL_AURA_MOD_POSSESS
Definition SpellAuraDefines.h:65
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References Object::GetGUID(), GetViewpoint(), SPELL_AURA_BIND_SIGHT, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9332{
9333 Unit* charm = GetCharm();
9334 if (!charm)
9335 {
9336 return;
9337 }
9338
9339 if (charm->IsCreature())
9340 {
9342 {
9343 ((Puppet*)charm)->UnSummon();
9344 }
9345 else if (charm->IsVehicle())
9346 {
9347 ExitVehicle();
9348 }
9349 }
9350
9351 if (GetCharmGUID())
9352 {
9357 }
9358
9359 if (GetCharmGUID())
9360 {
9361 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9362
9363 if (charm->GetCharmerGUID())
9364 {
9365 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9366 ABORT();
9367 }
9368 else
9369 {
9370 SetCharm(charm, false);
9371 }
9372 }
9373}
#define ABORT
Definition Errors.h:76
@ SPELL_AURA_MOD_CHARM
Definition SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240
@ UNIT_MASK_PUPPET
Definition UnitDefines.h:162
Definition TemporarySummon.h:115
bool IsVehicle() const
Definition Unit.h:766
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10935
ObjectGuid GetCharmGUID() const
Definition Unit.h:692

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Unit::HasUnitTypeMask(), Object::IsCreature(), Unit::IsVehicle(), LOG_FATAL, Unit::RemoveAurasByType(), Unit::SetCharm(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, Object::ToCreature(), ObjectGuid::ToString(), Position::ToString(), and UNIT_MASK_PUPPET.

Referenced by ActivateTaxiPathTo(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), Unit::RemoveAllControlled(), RemoveFromWorld(), Unit::SetCharmedBy(), and npc_chesspiece::sGossipSelect().

◆ StopMirrorTimer()

void Player::StopMirrorTimer ( MirrorTimerType  Type)
protected

◆ StopMirrorTimers()

◆ StoreItem()

Item * Player::StoreItem ( ItemPosCountVec const &  pos,
Item pItem,
bool  update 
)
2575{
2576 if (!pItem)
2577 return nullptr;
2578
2579 Item* lastItem = pItem;
2580 ItemTemplate const* proto = pItem->GetTemplate();
2581
2582 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2583 {
2584 uint16 pos = itr->pos;
2585 uint32 count = itr->count;
2586
2587 ++itr;
2588
2589 if (itr == dest.end())
2590 {
2591 lastItem = _StoreItem(pos, pItem, count, false, update);
2592 break;
2593 }
2594
2595 lastItem = _StoreItem(pos, pItem, count, true, update);
2596 }
2597
2598 // cast after item storing - some checks in checkcast requires item to be present!!
2599 if (lastItem)
2600 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2601 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
2602 if (!HasAura(proto->Spells[i].SpellId))
2603 CastSpell(this, proto->Spells[i].SpellId, true, lastItem);
2604
2605 return lastItem;
2606}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition PlayerStorage.cpp:2609

References _StoreItem(), Unit::CastSpell(), Item::GetTemplate(), Unit::HasAura(), ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, and _Spell::SpellTrigger.

Referenced by _LoadInventory(), AutoUnequipOffhandIfNeed(), BankItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleMailCreateTextItem(), MoveItemToInventory(), SplitItem(), StoreNewItem(), and SwapItem().

◆ StoreLootItem()

LootItem * Player::StoreLootItem ( uint8  lootSlot,
Loot loot,
InventoryResult msg 
)
13557{
13558 QuestItem* qitem = nullptr;
13559 QuestItem* ffaitem = nullptr;
13560 QuestItem* conditem = nullptr;
13561
13562 msg = EQUIP_ERR_OK;
13563
13564 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13565 if (!item || item->is_looted)
13566 {
13567 if (!sScriptMgr->CanSendErrorAlreadyLooted(this))
13568 {
13569 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13570 }
13571 return nullptr;
13572 }
13573
13574 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13575 // Xinef: only quest, ffa and conditioned items
13576 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13577 if (!qitem && !ffaitem && !conditem)
13578 {
13580 return nullptr;
13581 }
13582
13583 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13584 {
13586 return nullptr;
13587 }
13588
13589 // questitems use the blocked field for other purposes
13590 if (!qitem && item->is_blocked)
13591 {
13593 return nullptr;
13594 }
13595
13596 // xinef: dont allow protected item to be looted by someone else
13597 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13598 {
13600 return nullptr;
13601 }
13602
13603 ItemPosCountVec dest;
13604 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13605 if (msg == EQUIP_ERR_OK)
13606 {
13607 AllowedLooterSet looters = item->GetAllowedLooters();
13608 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13609
13610 if (qitem)
13611 {
13612 qitem->is_looted = true;
13613 //freeforall is 1 if everyone's supposed to get the quest item.
13614 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13615 SendNotifyLootItemRemoved(lootSlot);
13616 else
13617 loot->NotifyQuestItemRemoved(qitem->index);
13618 }
13619 else
13620 {
13621 if (ffaitem)
13622 {
13623 //freeforall case, notify only one player of the removal
13624 ffaitem->is_looted = true;
13625 SendNotifyLootItemRemoved(lootSlot);
13626 }
13627 else
13628 {
13629 //not freeforall, notify everyone
13630 if (conditem)
13631 conditem->is_looted = true;
13632 loot->NotifyItemRemoved(lootSlot);
13633 }
13634 }
13635
13636 //if only one person is supposed to loot the item, then set it to looted
13637 if (!item->freeforall)
13638 item->is_looted = true;
13639
13640 --loot->unlootedCount;
13641
13642 SendNewItem(newitem, uint32(item->count), false, false, true);
13643 UpdateLootAchievements(item, loot);
13644
13645 // LootItem is being removed (looted) from the container, delete it from the DB.
13646 if (loot->containerGUID)
13647 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13648
13649 sScriptMgr->OnLootItem(this, newitem, item->count, this->GetLootGUID());
13650 }
13651 else
13652 {
13653 SendEquipError(msg, nullptr, nullptr, item->itemid);
13654 }
13655
13656 return item;
13657}
bool IsItem() const
Definition Object.h:224
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition PlayerUpdates.cpp:2159
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition Player.cpp:8215
bool is_blocked
Definition LootMgr.h:164
ObjectGuid rollWinnerGUID
Definition LootMgr.h:161
bool is_underthreshold
Definition LootMgr.h:166
bool AllowedForPlayer(Player const *player, ObjectGuid source) const
Definition LootMgr.cpp:416
uint32 itemIndex
Definition LootMgr.h:156
bool is_looted
Definition LootMgr.h:163
const AllowedLooterSet & GetAllowedLooters() const
Definition LootMgr.h:181
bool freeforall
Definition LootMgr.h:165
ObjectGuid sourceWorldObjectGUID
Definition LootMgr.h:330
void NotifyQuestItemRemoved(uint8 questIndex)
Definition LootMgr.cpp:803
QuestItemMap const & GetPlayerQuestItems() const
Definition LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition LootMgr.cpp:772
Definition LootMgr.h:185
uint8 index
Definition LootMgr.h:186
bool is_looted
Definition LootMgr.h:187

References LootItem::AllowedForPlayer(), CanStoreNewItem(), Loot::containerGUID, LootItem::count, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_OK, LootItem::freeforall, LootItem::GetAllowedLooters(), GetGroup(), Object::GetGUID(), GetLootGUID(), Loot::GetPlayerQuestItems(), QuestItem::index, LootItem::is_blocked, LootItem::is_looted, QuestItem::is_looted, LootItem::is_underthreshold, Object::IsItem(), LootItem::itemid, LootItem::itemIndex, Loot::LootItemInSlot(), MASTER_LOOT, Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, LootItem::rollWinnerGUID, Loot::roundRobinPlayer, SendEquipError(), SendLootRelease(), SendNewItem(), SendNotifyLootItemRemoved(), sLootItemStorage, Loot::sourceWorldObjectGUID, sScriptMgr, StoreNewItem(), Loot::unlootedCount, and UpdateLootAchievements().

Referenced by Loot::FillNotNormalLootFor(), and WorldSession::HandleAutostoreLootItemOpcode().

◆ StoreNewItem() [1/2]

Item * Player::StoreNewItem ( ItemPosCountVec const &  pos,
uint32  item,
bool  update,
int32  randomPropertyId,
AllowedLooterSet allowedLooters 
)
2532{
2533 uint32 count = 0;
2534 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2535 count += itr->count;
2536
2537 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2538 if (pItem)
2539 {
2540 // pussywizard: obtaining blue or better items saves to db
2541 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2542 if (pProto->Quality >= ITEM_QUALITY_RARE)
2544
2545 ItemAddedQuestCheck(item, count);
2548 pItem = StoreItem(dest, pItem, update);
2549
2550 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2551 {
2552 pItem->SetSoulboundTradeable(allowedLooters);
2554 AddTradeableItem(pItem);
2555
2556 // save data
2557 std::ostringstream ss;
2558 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2559 ss << (*itr).GetCounter();
2560 for (++itr; itr != allowedLooters.end(); ++itr)
2561 ss << ' ' << (*itr).GetCounter();
2562
2564 stmt->SetData(0, pItem->GetGUID().GetCounter());
2565 stmt->SetData(1, ss.str());
2566 CharacterDatabase.Execute(stmt);
2567 }
2568
2569 sScriptMgr->OnStoreNewItem(this, pItem, count);
2570 }
2571 return pItem;
2572}
@ CHAR_INS_ITEM_BOP_TRADE
Definition CharacterDatabase.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition DBCEnums.h:150
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition IWorld.h:168
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition UpdateFields.h:71

References ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), AddTradeableItem(), CHAR_INS_ITEM_BOP_TRADE, CharacterDatabase, CONFIG_SET_BOP_ITEM_TRADEABLE, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), GetTotalPlayedTime(), Item::IsSoulBound(), ITEM_FIELD_CREATE_PLAYED_TIME, ITEM_QUALITY_RARE, ItemAddedQuestCheck(), PreparedStatementBase::SetData(), Item::SetSoulboundTradeable(), Object::SetUInt32Value(), sObjectMgr, sScriptMgr, StoreItem(), sWorld, and UpdateAchievementCriteria().

◆ StoreNewItem() [2/2]

◆ StoreNewItemInBestSlots()

bool Player::StoreNewItemInBestSlots ( uint32  item_id,
uint32  item_count 
)
698{
699 LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = {}, count = {}", titem_id, titem_amount);
700
701 // attempt equip by one
702 while (titem_amount > 0)
703 {
704 uint16 eDest;
705 InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
706 if (msg != EQUIP_ERR_OK)
707 break;
708
709 EquipNewItem(eDest, titem_id, true);
711 --titem_amount;
712 }
713
714 if (titem_amount == 0)
715 return true; // equipped
716
717 // attempt store
718 ItemPosCountVec sDest;
719 // store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
720 InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
721 if (msg == EQUIP_ERR_OK)
722 {
723 StoreNewItem(sDest, titem_id, true);
724 return true; // stored
725 }
726
727 // item can't be added
728 LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg);
729 return false;
730}

References AutoUnequipOffhandIfNeed(), CanEquipNewItem(), CanStoreNewItem(), EQUIP_ERR_OK, EquipNewItem(), Unit::getClass(), Unit::getRace(), INVENTORY_SLOT_BAG_0, LOG_DEBUG, LOG_ERROR, NULL_SLOT, and StoreNewItem().

Referenced by Create().

◆ StoreRaidMapDifficulty()

void Player::StoreRaidMapDifficulty ( )
inline

◆ SummonIfPossible()

void Player::SummonIfPossible ( bool  agree,
ObjectGuid  summoner_guid 
)
12456{
12457 if (!agree)
12458 {
12459 m_summon_expire = 0;
12460 return;
12461 }
12462
12463 // expire and auto declined
12464 if (m_summon_expire < GameTime::GetGameTime().count())
12465 return;
12466
12467 // drop flag at summon
12468 // this code can be reached only when GM is summoning player who carries flag, because player should be immune to summoning spells when he carries flag
12469 if (Battleground* bg = GetBattleground())
12470 bg->EventPlayerDroppedFlag(this);
12471
12472 m_summon_expire = 0;
12473
12475
12477}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition DBCEnums.h:220
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ObjectAccessor::FindPlayer(), GetBattleground(), GameTime::GetGameTime(), Position::GetOrientation(), m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, TeleportTo(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleSummonResponseOpcode().

◆ SummonPet()

Pet * Player::SummonPet ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
PetType  petType,
Milliseconds  duration = 0s,
uint32  healthPct = 0 
)
8968{
8969 PetStable& petStable = GetOrInitPetStable();
8970
8971 Pet* pet = new Pet(this, petType);
8972
8973 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
8974 {
8975 // Remove Demonic Sacrifice auras (known pet)
8977 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8978 {
8979 if ((*itr)->GetMiscValue() == 2228)
8980 {
8981 RemoveAurasDueToSpell((*itr)->GetId());
8982 itr = auraClassScripts.begin();
8983 }
8984 else
8985 ++itr;
8986 }
8987
8988 if (duration > 0s)
8989 pet->SetDuration(duration);
8990
8991 // Generate a new name for the newly summoned ghoul
8992 if (pet->IsPetGhoul())
8993 {
8994 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
8995 if (!new_name.empty())
8996 pet->SetName(new_name);
8997 }
8998
8999 return nullptr;
9000 }
9001
9002 // petentry == 0 for hunter "call pet" (current pet summoned if any)
9003 if (!entry)
9004 {
9005 delete pet;
9006 return nullptr;
9007 }
9008
9009 pet->Relocate(x, y, z, ang);
9010 if (!pet->IsPositionValid())
9011 {
9012 LOG_ERROR("misc", "Player::SummonPet: Pet ({}, Entry: {}) not summoned. Suggested coordinates aren't valid (X: {} Y: {})", pet->GetGUID().ToString(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
9013 delete pet;
9014 return nullptr;
9015 }
9016
9017 Map* map = GetMap();
9018 uint32 pet_number = sObjectMgr->GeneratePetNumber();
9019 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
9020 {
9021 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
9022 delete pet;
9023 return nullptr;
9024 }
9025
9026 if (petType == SUMMON_PET && petStable.CurrentPet)
9028
9029 pet->SetCreatorGUID(GetGUID());
9030 pet->SetFaction(GetFaction());
9035
9036 SetMinion(pet, true);
9037
9038 if (petType == SUMMON_PET)
9039 {
9041 {
9042 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
9043 }
9044 else
9045 {
9046 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
9047 }
9048
9051 pet->SetFullHealth();
9053 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
9054 }
9055
9056 map->AddToMap(pet->ToCreature(), true);
9057
9058 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
9059 pet->FillPetInfo(&petStable.CurrentPet.emplace());
9060
9061 if (petType == SUMMON_PET)
9062 {
9063 pet->InitPetCreateSpells();
9064 pet->InitTalentForLevel();
9067
9068 // Remove Demonic Sacrifice auras (known pet)
9070 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
9071 {
9072 if ((*itr)->GetMiscValue() == 2228)
9073 {
9074 RemoveAurasDueToSpell((*itr)->GetId());
9075 itr = auraClassScripts.begin();
9076 }
9077 else
9078 ++itr;
9079 }
9080 }
9081
9082 if (duration > 0s)
9083 pet->SetDuration(duration);
9084
9086 {
9089 }
9090
9091 return pet;
9092}
@ SUMMON_PET
Definition PetDefines.h:31
@ CREATURE_TYPE_UNDEAD
Definition SharedDefines.h:2633
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2630
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175
@ UNIT_NPC_FLAG_NONE
Definition UnitDefines.h:314
@ UNIT_FIELD_PETEXPERIENCE
Definition UpdateFields.h:134
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
@ UNIT_FIELD_PETNEXTLEVELEXP
Definition UpdateFields.h:135
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1015
ObjectGuid::LowType GenerateLowGuid()
Definition Map.h:636
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2468
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition Pet.cpp:2312
void SetDuration(Milliseconds dur)
Definition Pet.h:90
void InitPetCreateSpells()
Definition Pet.cpp:2043
PetStable & GetOrInitPetStable()
Definition Player.cpp:15619
float GetHealthPct() const
Definition Unit.h:1040
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:737
void SetName(std::string const &newname)
Definition Object.h:464
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240
uint32 type
Definition CreatureData.h:222

References Map::AddToMap(), ASSERT, Pet::Create(), CREATURE_TYPE_DEMON, CREATURE_TYPE_UNDEAD, PetStable::CurrentPet, CreatureTemplate::family, Pet::FillPetInfo(), WorldObject::FindMap(), Map::GenerateLowGuid(), Unit::GetAuraEffectsByType(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), Unit::GetFaction(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), Unit::GetHealthPct(), Unit::GetLevel(), WorldObject::GetMap(), Unit::GetMaxPower(), GetOrInitPetStable(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), GetSession(), PetStable::GetUnslottedHunterPet(), HUNTER_PET, Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Pet::InitTalentForLevel(), Minion::IsPetGhoul(), Position::IsPositionValid(), Pet::LoadPetFromDB(), LOG_ERROR, NeedSendSpectatorData(), Pet, PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT, PetSpellInitialize(), POWER_MANA, Position::Relocate(), Unit::RemoveAurasDueToSpell(), RemovePet(), Unit::ReplaceAllNpcFlags(), Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), Unit::SetCreatorGUID(), Pet::SetDuration(), Unit::SetFaction(), Unit::SetFullHealth(), Unit::SetMinion(), WorldObject::SetName(), CharmInfo::SetPetNumber(), Unit::SetPower(), Unit::setPowerType(), Unit::SetUInt32Value(), sObjectMgr, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SUMMON_PET, Object::ToCreature(), ObjectGuid::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_1, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FIELD_PETEXPERIENCE, UNIT_FIELD_PETNEXTLEVELEXP, and UNIT_NPC_FLAG_NONE.

Referenced by Spell::EffectResurrectPet(), and Spell::EffectSummonPet().

◆ SwapItem()

void Player::SwapItem ( uint16  src,
uint16  dst 
)
3537{
3538 uint8 srcbag = src >> 8;
3539 uint8 srcslot = src & 255;
3540
3541 uint8 dstbag = dst >> 8;
3542 uint8 dstslot = dst & 255;
3543
3544 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3545 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3546
3547 if (!pSrcItem)
3548 return;
3549
3550 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3551
3552 if (!IsAlive())
3553 {
3554 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3555 return;
3556 }
3557
3558 // SRC checks
3559
3560 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3561 {
3562 //best error message found for attempting to swap while looting
3563 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3564 return;
3565 }
3566
3567 // check unequip potability for equipped items and bank bags
3568 if (IsEquipmentPos(src) || IsBagPos(src))
3569 {
3570 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3571 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3572 if (msg != EQUIP_ERR_OK)
3573 {
3574 SendEquipError(msg, pSrcItem, pDstItem);
3575 return;
3576 }
3577 }
3578
3579 // anti-wpe
3580 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3581 {
3583 return;
3584 }
3585
3586 // prevent put equipped/bank bag in self
3587 if (IsBagPos(src) && srcslot == dstbag)
3588 {
3590 return;
3591 }
3592
3593 // prevent equipping bag in the same slot from its inside
3594 if (IsBagPos(dst) && srcbag == dstslot)
3595 {
3597 return;
3598 }
3599
3600 // DST checks
3601
3602 if (pDstItem)
3603 {
3604 // Xinef: Removed next loot generated check
3605 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3606 {
3607 //best error message found for attempting to swap while looting
3608 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3609 return;
3610 }
3611
3612 // check unequip potability for equipped items and bank bags
3613 if (IsEquipmentPos(dst) || IsBagPos(dst))
3614 {
3615 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3616 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3617 if (msg != EQUIP_ERR_OK)
3618 {
3619 SendEquipError(msg, pSrcItem, pDstItem);
3620 return;
3621 }
3622 }
3623 }
3624
3625 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3626 // or swap empty bag with another empty or not empty bag (with items exchange)
3627
3628 // Move case
3629 if (!pDstItem)
3630 {
3631 if (IsInventoryPos(dst))
3632 {
3633 ItemPosCountVec dest;
3634 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3635 if (msg != EQUIP_ERR_OK)
3636 {
3637 SendEquipError(msg, pSrcItem, nullptr);
3638 return;
3639 }
3640
3641 RemoveItem(srcbag, srcslot, true);
3642 StoreItem(dest, pSrcItem, true);
3644 if (IsBankPos(src))
3645 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3646 }
3647 else if (IsBankPos(dst))
3648 {
3649 ItemPosCountVec dest;
3650 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3651 if (msg != EQUIP_ERR_OK)
3652 {
3653 SendEquipError(msg, pSrcItem, nullptr);
3654 return;
3655 }
3656
3657 RemoveItem(srcbag, srcslot, true);
3658 BankItem(dest, pSrcItem, true);
3660 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3661 }
3662 else if (IsEquipmentPos(dst))
3663 {
3664 uint16 dest;
3665 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3666 if (msg != EQUIP_ERR_OK)
3667 {
3668 SendEquipError(msg, pSrcItem, nullptr);
3669 return;
3670 }
3671
3672 RemoveItem(srcbag, srcslot, true);
3673 EquipItem(dest, pSrcItem, true);
3675 }
3676
3677 return;
3678 }
3679
3680 // attempt merge to / fill target item
3681 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3682 {
3683 InventoryResult msg;
3684 ItemPosCountVec sDest;
3685 uint16 eDest = 0;
3686 if (IsInventoryPos(dst))
3687 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3688 else if (IsBankPos(dst))
3689 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3690 else if (IsEquipmentPos(dst))
3691 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3692 else
3693 return;
3694
3695 // can be merge/fill
3696 if (msg == EQUIP_ERR_OK)
3697 {
3698 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3699 {
3700 RemoveItem(srcbag, srcslot, true);
3701
3702 if (IsInventoryPos(dst))
3703 StoreItem(sDest, pSrcItem, true);
3704 else if (IsBankPos(dst))
3705 BankItem(sDest, pSrcItem, true);
3706 else if (IsEquipmentPos(dst))
3707 {
3708 EquipItem(eDest, pSrcItem, true);
3710 }
3711 }
3712 else
3713 {
3714 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3715 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3716 pSrcItem->SetState(ITEM_CHANGED, this);
3717 pDstItem->SetState(ITEM_CHANGED, this);
3718 if (IsInWorld())
3719 {
3720 pSrcItem->SendUpdateToPlayer(this);
3721 pDstItem->SendUpdateToPlayer(this);
3722 }
3723 }
3724 SendRefundInfo(pDstItem);
3725 return;
3726 }
3727 }
3728
3729 // Remove item enchantments for now and restore it later
3730 // Needed for swap sanity checks
3731 ApplyEnchantment(pSrcItem, false);
3732 if (pDstItem)
3733 {
3734 ApplyEnchantment(pDstItem, false);
3735 }
3736
3737 // impossible merge/fill, do real swap
3739
3740 // check src->dest move possibility
3741 ItemPosCountVec sDest;
3742 uint16 eDest = 0;
3743 if (IsInventoryPos(dst))
3744 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3745 else if (IsBankPos(dst))
3746 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3747 else if (IsEquipmentPos(dst))
3748 {
3749 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3750 if (msg == EQUIP_ERR_OK)
3751 msg = CanUnequipItem(eDest, true);
3752 }
3753
3754 if (msg != EQUIP_ERR_OK)
3755 {
3756 // Restore enchantments
3757 ApplyEnchantment(pSrcItem, true);
3758 if (pDstItem)
3759 {
3760 ApplyEnchantment(pDstItem, true);
3761 }
3762
3763 SendEquipError(msg, pSrcItem, pDstItem);
3764 return;
3765 }
3766
3767 // check dest->src move possibility
3768 ItemPosCountVec sDest2;
3769 uint16 eDest2 = 0;
3770 if (IsInventoryPos(src))
3771 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3772 else if (IsBankPos(src))
3773 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3774 else if (IsEquipmentPos(src))
3775 {
3776 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3777 if (msg == EQUIP_ERR_OK)
3778 msg = CanUnequipItem(eDest2, true);
3779 }
3780
3781 if (msg != EQUIP_ERR_OK)
3782 {
3783 // Restore enchantments
3784 ApplyEnchantment(pSrcItem, true);
3785 if (pDstItem)
3786 {
3787 ApplyEnchantment(pDstItem, true);
3788 }
3789
3790 SendEquipError(msg, pDstItem, pSrcItem);
3791 return;
3792 }
3793
3794 // Restore enchantments
3795 ApplyEnchantment(pSrcItem, true);
3796 if (pDstItem)
3797 {
3798 ApplyEnchantment(pDstItem, true);
3799 }
3800
3801 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3802 if (Bag* srcBag = pSrcItem->ToBag())
3803 {
3804 if (Bag* dstBag = pDstItem->ToBag())
3805 {
3806 Bag* emptyBag = nullptr;
3807 Bag* fullBag = nullptr;
3808 if (srcBag->IsEmpty() && !IsBagPos(src))
3809 {
3810 emptyBag = srcBag;
3811 fullBag = dstBag;
3812 }
3813 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3814 {
3815 emptyBag = dstBag;
3816 fullBag = srcBag;
3817 }
3818
3819 // bag swap (with items exchange) case
3820 if (emptyBag && fullBag)
3821 {
3822 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3823
3824 uint32 count = 0;
3825
3826 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3827 {
3828 Item* bagItem = fullBag->GetItemByPos(i);
3829 if (!bagItem)
3830 continue;
3831
3832 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3833 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3834 {
3835 // one from items not go to empty target bag
3837 return;
3838 }
3839
3840 ++count;
3841 }
3842
3843 if (count > emptyBag->GetBagSize())
3844 {
3845 // too small targeted bag
3847 return;
3848 }
3849
3850 // Items swap
3851 count = 0; // will pos in new bag
3852 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3853 {
3854 Item* bagItem = fullBag->GetItemByPos(i);
3855 if (!bagItem)
3856 continue;
3857
3858 fullBag->RemoveItem(i, true);
3859 emptyBag->StoreItem(count, bagItem, true);
3860 bagItem->SetState(ITEM_CHANGED, this);
3861
3862 ++count;
3863 }
3864 }
3865 }
3866 }
3867
3868 // now do moves, remove...
3869 RemoveItem(dstbag, dstslot, false, true);
3870 RemoveItem(srcbag, srcslot, false, true);
3871
3872 // add to dest
3873 if (IsInventoryPos(dst))
3874 StoreItem(sDest, pSrcItem, true);
3875 else if (IsBankPos(dst))
3876 BankItem(sDest, pSrcItem, true);
3877 else if (IsEquipmentPos(dst))
3878 EquipItem(eDest, pSrcItem, true);
3879
3880 // add to src
3881 if (IsInventoryPos(src))
3882 StoreItem(sDest2, pDstItem, true);
3883 else if (IsBankPos(src))
3884 BankItem(sDest2, pDstItem, true);
3885 else if (IsEquipmentPos(src))
3886 EquipItem(eDest2, pDstItem, true);
3887
3888 // Xinef: Call this here after all needed items are equipped
3890
3891 // if player is moving bags and is looting an item inside this bag
3892 // release the loot
3893 if (GetLootGUID())
3894 {
3895 bool released = false;
3896 if (IsBagPos(src))
3897 {
3898 Bag* bag = pSrcItem->ToBag();
3899 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3900 {
3901 if (Item* bagItem = bag->GetItemByPos(i))
3902 {
3903 // Xinef: Removed next loot generated check
3904 if (bagItem->GetGUID() == GetLootGUID())
3905 {
3907 released = true; // so we don't need to look at dstBag
3908 break;
3909 }
3910 }
3911 }
3912 }
3913
3914 if (!released && IsBagPos(dst))
3915 {
3916 Bag* bag = pDstItem->ToBag();
3917 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3918 {
3919 if (Item* bagItem = bag->GetItemByPos(i))
3920 {
3921 // Xinef: Removed next loot generated check
3922 if (bagItem->GetGUID() == GetLootGUID())
3923 {
3925 released = true; // not realy needed here
3926 break;
3927 }
3928 }
3929 }
3930 }
3931 }
3932
3934}
bool IsEmpty() const
Definition Bag.cpp:179
Item * GetItemByPos(uint8 slot) const
Definition Bag.cpp:235
void RemoveItem(uint8 slot, bool update)
Definition Bag.cpp:143
void SendRefundInfo(Item *item)
Definition Player.cpp:15556

References ApplyEnchantment(), AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CanUnequipItem(), WorldSession::DoLootRelease(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, EquipItem(), Bag::GetBagSize(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Bag::GetItemByPos(), GetLootGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), Unit::IsAlive(), Item::IsBag(), IsBagPos(), IsBankPos(), Bag::IsEmpty(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_CHANGED, ItemAddedQuestCheck(), ItemCanGoIntoBag(), ItemRemovedQuestCheck(), LOG_DEBUG, m_session, RemoveItem(), Bag::RemoveItem(), RemoveItemDependentAurasAndCasts(), SendEquipError(), SendRefundInfo(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), Bag::StoreItem(), Item::ToBag(), and UpdateTitansGrip().

Referenced by WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleEquipmentSetUse(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSwapInvItemOpcode(), and WorldSession::HandleSwapItem().

◆ SwapQuestSlot()

void Player::SwapQuestSlot ( uint16  slot1,
uint16  slot2 
)
inline
1517 {
1518 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
1519 {
1522
1525 }
1526 }

References Object::GetUInt32Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and Unit::SetUInt32Value().

Referenced by WorldSession::HandleQuestLogSwapQuest().

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1364{
1365 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1366 if (quest)
1367 {
1368 uint32 srcItemId = quest->GetSrcItemId();
1369 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1370
1371 if (srcItemId > 0)
1372 {
1373 uint32 count = quest->GetSrcItemCount();
1374 if (count <= 0)
1375 count = 1;
1376
1377 // exist two cases when destroy source quest item not possible:
1378 // a) non un-equippable item (equipped non-empty bag, for example)
1379 // b) when quest is started from an item and item also is needed in
1380 // the end as RequiredItemId
1381 InventoryResult res = CanUnequipItems(srcItemId, count);
1382 if (res != EQUIP_ERR_OK)
1383 {
1384 if (msg)
1385 SendEquipError(res, nullptr, nullptr, srcItemId);
1386 return false;
1387 }
1388
1389 bool destroyItem = true;
1390 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1391 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1392 destroyItem = false;
1393
1394 if (destroyItem)
1395 DestroyItemCount(srcItemId, count, true, true);
1396 }
1397 }
1398
1399 return true;
1400}
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition PlayerStorage.cpp:273
uint32 GetSrcItemCount() const
Definition QuestDef.h:259
uint32 GetSrcItemId() const
Definition QuestDef.h:258
uint32 StartQuest
Definition ItemTemplate.h:668

References CanUnequipItems(), DestroyItemCount(), EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), QUEST_ITEM_OBJECTIVES_COUNT, Quest::RequiredItemId, SendEquipError(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by Spell::EffectQuestClear(), and WorldSession::HandleQuestLogRemoveQuest().

◆ TalkedToCreature()

void Player::TalkedToCreature ( uint32  entry,
ObjectGuid  guid 
)
2113{
2114 uint16 addTalkCount = 1;
2115 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2116 {
2117 uint32 questid = GetQuestSlotQuestId(i);
2118 if (!questid)
2119 continue;
2120
2121 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2122 if (!qInfo)
2123 continue;
2124
2125 QuestStatusData& q_status = m_QuestStatus[questid];
2126
2127 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2128 {
2130 {
2131 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2132 {
2133 // skip Gameobject objectives
2134 if (qInfo->RequiredNpcOrGo[j] < 0)
2135 continue;
2136
2137 uint32 reqTarget = 0;
2138
2139 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2140 // checked at quest_template loading
2141 reqTarget = qInfo->RequiredNpcOrGo[j];
2142 else
2143 continue;
2144
2145 if (reqTarget == entry)
2146 {
2147 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2148 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2149 if (curTalkCount < reqTalkCount)
2150 {
2151 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2152
2153 m_QuestStatusSave[questid] = true;
2154
2155 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2156 }
2157 if (CanCompleteQuest(questid))
2158 CompleteQuest(questid);
2159 else
2161
2162 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2163 continue;
2164 }
2165 }
2166 }
2167 }
2168 }
2169}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by npc_aged_dying_ancient_kodo::OnGossipHello(), brann_bronzebeard::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_razael_and_lyana::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static

◆ TeleportTo() [1/2]

bool Player::TeleportTo ( uint32  mapid,
float  x,
float  y,
float  z,
float  orientation,
uint32  options = 0,
Unit target = nullptr,
bool  newInstance = false 
)
1335{
1336 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1337 {
1338 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1339 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1340 return false;
1341 }
1342
1343 if (AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapid, this))
1344 {
1345 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1347 return false;
1348 }
1349
1350 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1351 Pet* pet = GetPet();
1352
1353 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1354
1355 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1356 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1357 return false;
1358
1359 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1360 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1361 {
1363 return false;
1364 }
1365
1366 // client without expansion support
1367 if (GetSession()->Expansion() < mEntry->Expansion())
1368 {
1369 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1370
1371 if (GetTransport())
1372 {
1374 m_transport = nullptr;
1377 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1378 }
1379
1381
1382 return false; // normal client can't teleport to this map...
1383 }
1384 else
1385 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1386
1387 // xinef: do this here in case teleport failed in above checks
1388 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1389 {
1392 }
1393
1394 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1395 ExitVehicle();
1396
1397 // reset movement flags at teleport, because player will continue move with these flags after teleport
1399 DisableSpline();
1400
1401 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1402 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1403 {
1408 // remove auras that should be removed when being teleported
1410 }
1411
1412 if (m_transport)
1413 {
1414 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1416 else
1417 {
1419 m_transport = nullptr;
1422 }
1423 }
1424
1425 // The player was ported to another map and loses the duel immediately.
1426 // We have to perform this check before the teleport, otherwise the
1427 // ObjectAccessor won't find the flag.
1430
1431 if (!sScriptMgr->OnBeforePlayerTeleport(this, mapid, x, y, z, orientation, options, target))
1432 return false;
1433
1434 if (GetMapId() == mapid && !newInstance)
1435 {
1436 //lets reset far teleport flag if it wasn't reset during chained teleports
1438
1439 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1440 //if teleport spell is casted in Unit::Update() func
1441 //then we need to delay it until update process will be finished
1442 if (MustDelayTeleport())
1443 {
1446 //lets save teleport destination for player
1447 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1448 teleportStore_options = options;
1449 return true;
1450 }
1451
1452 if (options & TELE_TO_WITH_PET)
1454
1455 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1456 {
1457 //same map, only remove pet if out of range for new position
1458 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1460 }
1461
1462 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1463 CombatStop();
1464
1465 // this will be used instead of the current location in SaveToDB
1466 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1468
1469 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1470 // at client packet MSG_MOVE_TELEPORT_ACK
1472 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1473 if (!GetSession()->PlayerLogout())
1474 {
1475 SetCanTeleport(true);
1476 Position oldPos = GetPosition();
1477 Relocate(x, y, z, orientation);
1479 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1480 }
1481 }
1482 else
1483 {
1485 {
1487 return false;
1488 }
1489
1490 // far teleport to another map
1491 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1492 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1493
1494 // Check enter rights before map getting to avoid creating instance copy for player
1495 // this check not dependent from map instance copy and same for all instance copies of selected map
1496 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1497 return false;
1498
1499 // if PlayerCannotEnter -> CanEnter: checked above
1500 {
1501 //lets reset near teleport flag if it wasn't reset during chained teleports
1503
1504 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1505 //if teleport spell is casted in Unit::Update() func
1506 //then we need to delay it until update process will be finished
1507 if (MustDelayTeleport())
1508 {
1511 //lets save teleport destination for player
1512 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1513 teleportStore_options = options;
1514 return true;
1515 }
1516
1518
1519 CombatStop();
1520
1521 // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned
1523 {
1524 // KEEP THIS ORDER!
1526 if (pet)
1527 pet->RemoveArenaAuras();
1528
1530 }
1531
1532 // remove pet on map change
1533 if (pet)
1535
1536 // remove all dyn objects
1538
1539 // stop spellcasting
1540 // not attempt interrupt teleportation spell at caster teleport
1541 if (!(options & TELE_TO_SPELL))
1542 if (IsNonMeleeSpellCast(true))
1544
1545 //remove auras before removing from map...
1547
1548 if (!GetSession()->PlayerLogout())
1549 {
1550 // send transfer packets
1551 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1552 data << uint32(mapid);
1553 if (m_transport)
1554 data << m_transport->GetEntry() << GetMapId();
1555
1556 GetSession()->SendPacket(&data);
1557 }
1558
1559 // remove from old map now
1560 if (oldmap)
1561 oldmap->RemovePlayerFromMap(this, false);
1562
1563 // xinef: do this before setting fall information!
1564 if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport)
1565 {
1567 if (!auras.empty())
1568 {
1569 SetMountBlockId((*auras.begin())->GetId());
1571 }
1572 }
1573
1574 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1576 // if the player is saved before worldportack (at logout for example)
1577 // this will be used instead of the current location in SaveToDB
1578
1579 if (!GetSession()->PlayerLogout())
1580 {
1581 SetCanTeleport(true);
1582 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1583 data << uint32(mapid);
1584 if (m_transport)
1586 else
1588
1589 GetSession()->SendPacket(&data);
1591 }
1592
1593 // move packet sent by client always after far teleport
1594 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1596 }
1597 }
1598 return true;
1599}
@ TELE_TO_WITH_PET
Definition Player.h:832
@ TELE_TO_NOT_LEAVE_TAXI
Definition Player.h:833
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:831
@ TELE_TO_SPELL
Definition Player.h:830
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:828
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:829
@ TELE_TO_GM_MODE
Definition Player.h:826
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:827
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition Player.h:803
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition SpellDefines.h:65
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition UnitDefines.h:414
@ CLASS_CONTEXT_TELEPORT
Definition UnitDefines.h:228
virtual void RemovePlayerFromMap(Player *, bool)
Definition Map.cpp:914
bool HasPendingSpectatorForBG(uint32 bgInstanceId) const
Definition Player.h:2588
void SendTeleportAckPacket()
Definition Player.cpp:1325
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition Player.cpp:11592
void SendSavedInstances()
Definition PlayerStorage.cpp:6557
void SetSemaphoreTeleportNear(time_t tm)
Definition Player.h:2101
void SetHasDelayedTeleport(bool setting)
Definition Player.h:2956
void SetSemaphoreTeleportFar(time_t tm)
Definition Player.h:2102
bool MustDelayTeleport() const
Definition Player.h:2953
void CleanupAfterTaxiFlight()
Definition Player.cpp:10467
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition Player.cpp:3552
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition Unit.h:746
Vehicle * m_vehicle
Definition Unit.h:2111
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:20072
void SetUnitMovementFlags(uint32 f)
Definition Unit.h:747
void RemoveAllDynObjects()
Definition Unit.cpp:6219
void RemoveArenaAuras()
Definition Unit.cpp:5368
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition Object.cpp:1306
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1274
@ SMSG_NEW_WORLD
Definition Opcodes.h:92
@ SMSG_TRANSFER_PENDING
Definition Opcodes.h:93
bool IsBattleArena() const
Definition DBCStructure.h:1355
Position GetPosition() const
Definition Position.h:142
Position::PositionXYZOStreamer PositionXYZOStream()
Definition Position.h:149

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), Unit::GetAuraEffectsByType(), GetBattlegroundId(), WorldObject::GetDistance2d(), Object::GetEntry(), Unit::GetGameObject(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetName(), Position::GetOrientation(), GetPet(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), WorldObject::GetTransport(), Unit::GetUnitMovementFlags(), WorldObject::GetVisibilityRange(), HasPendingSpectatorForBG(), HasSpell(), InBattleground(), MapEntry::Instanceable(), Unit::InterruptNonMeleeSpells(), MapEntry::IsBattleArena(), MapEntry::IsBattlegroundOrArena(), IsClass(), IsGameMaster(), Unit::IsInFlight(), Object::IsInWorld(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), AccountMgr::IsPlayerAccount(), IsSpectator(), MapMgr::IsValidMapCoord(), WorldObject::IsWithinDist3d(), LOG_DEBUG, LOG_ERROR, WorldObject::m_movementInfo, WorldObject::m_transport, Unit::m_vehicle, MotionMaster::MovementExpired(), MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE, MOVEMENTFLAG_ONTRANSPORT, MustDelayTeleport(), PLAYER_DUEL_ARBITER, MovementInfo::TransportInfo::pos, Position::PositionXYZOStream(), Position::Relocate(), Unit::RemoveAllDynObjects(), Unit::RemoveArenaAuras(), RemoveArenaSpellCooldowns(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), Map::RemovePlayerFromMap(), RepopAtGraveyard(), MovementInfo::TransportInfo::Reset(), sDisableMgr, WorldSession::SendPacket(), SendSavedInstances(), SendTeleportAckPacket(), Unit::SendTeleportPacket(), SendTransferAborted(), SetCanTeleport(), SetFallInformation(), SetHasDelayedTeleport(), SetMountBlockId(), SetSelection(), SetSemaphoreTeleportFar(), SetSemaphoreTeleportNear(), Unit::SetUnitMovementFlags(), sMapMgr, sMapStore, SMSG_NEW_WORLD, SMSG_TRANSFER_PENDING, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, sScriptMgr, TELE_TO_GM_MODE, TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TAXI, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, teleportStore_dest, teleportStore_options, Position::ToString(), TRANSFER_ABORT_INSUF_EXPAN_LVL, TRANSFER_ABORT_MAP_NOT_ALLOWED, TRANSFER_ABORT_UNIQUE_MESSAGE, MovementInfo::transport, and UnsummonPetTemporaryIfAny().

Referenced by ActivateTaxiPathTo(), BattlegroundSA::CaptureGraveyard(), BattlegroundSA::DefendersPortalTeleport(), MotionTransport::DelayedTeleportTransport(), BattlegroundIC::DoAction(), go_commandscript::DoTeleport(), Spell::EffectTeleportUnits(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleWorldTeleportOpcode(), Unit::NearTeleportTo(), npc_wg_spirit_guide::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerJoinWar(), at_orb_of_command::OnTrigger(), at_icc_saurfang_portal::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), BfGraveyard::RelocateDeadPlayers(), Battleground::RelocateDeadPlayers(), Map::RemoveAllPlayers(), RepopAtGraveyard(), ResurectUsingRequestData(), WorldSession::SendSpiritResurrect(), BattlegroundMgr::SendToBattleground(), SummonIfPossible(), lfg::LFGMgr::TeleportPlayer(), GmTicket::TeleportTo(), TeleportTo(), BattlegroundSA::TeleportToEntrancePosition(), TeleportToEntryPoint(), Update(), and GameObject::Use().

◆ TeleportTo() [2/2]

bool Player::TeleportTo ( WorldLocation const &  loc,
uint32  options = 0,
Unit target = nullptr 
)
inline
1109 {
1110 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1111 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and TeleportTo().

◆ TeleportToEntryPoint()

◆ TextEmote() [1/2]

void Player::TextEmote ( std::string_view  text,
WorldObject const *  = nullptr,
bool  = false 
)
overridevirtual

Outputs an universal text which is supposed to be an action.

Reimplemented from Unit.

9417{
9418 std::string _text(text);
9419
9420 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9421 {
9422 return;
9423 }
9424
9425 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9426
9427 WorldPacket data;
9429
9430 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, false, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), true);
9431}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition IWorld.h:159
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition IWorld.h:196
@ CHAT_MSG_EMOTE
Definition SharedDefines.h:3162
@ LANG_UNIVERSAL
Definition SharedDefines.h:735

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ TextEmote() [2/2]

void Player::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
overridevirtual

Reimplemented from Unit.

9434{
9435 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9436}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1294{
1296
1297 // afk player not allowed in battleground
1298 if (!IsGameMaster() && isAFK() && InBattleground())
1300}
void ToggleFlag(uint16 index, uint32 flag)
Definition Object.cpp:877
void LeaveBattleground(Battleground *bg=nullptr)
Definition Player.cpp:11358

References InBattleground(), isAFK(), IsGameMaster(), LeaveBattleground(), PLAYER_FLAGS, PLAYER_FLAGS_AFK, and Object::ToggleFlag().

Referenced by Battleground::AddPlayer(), WorldSession::HandleMessagechatOpcode(), Battlefield::PlayerAcceptInviteToWar(), and Unit::SetCharmedBy().

◆ ToggleDND()

void Player::ToggleDND ( )

◆ ToggleInstantFlight()

void Player::ToggleInstantFlight ( )

References m_isInstantFlightOn.

Referenced by OnGossipSelect().

◆ ToggleMetaGemsActive()

void Player::ToggleMetaGemsActive ( uint8  exceptslot,
bool  apply 
)
11289{
11290 //cycle all equipped items
11291 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11292 {
11293 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11294 if (slot == exceptslot)
11295 continue;
11296
11297 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11298
11299 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11300 continue;
11301
11302 //cycle all (gem)enchants
11303 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11304 {
11305 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11306 if (!enchant_id) //if no enchant go to next enchant(slot)
11307 continue;
11308
11309 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11310 if (!enchantEntry)
11311 continue;
11312
11313 //only metagems to be (de)activated, so only enchants with condition
11314 uint32 condition = enchantEntry->EnchantmentCondition;
11315 if (condition)
11316 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11317 }
11318 }
11319}

References ApplyEnchantment(), _Socket::Color, SpellItemEnchantmentEntry::EnchantmentCondition, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, ItemTemplate::Socket, and sSpellItemEnchantmentStore.

Referenced by WorldSession::HandleSocketOpcode().

◆ TradeCancel()

void Player::TradeCancel ( bool  sendback)
4089{
4090 if (m_trade)
4091 {
4092 Player* trader = m_trade->GetTrader();
4093
4094 // send yellow "Trade canceled" message to both traders
4095 if (sendback)
4097
4098 trader->GetSession()->SendCancelTrade();
4099
4100 // cleanup
4101 delete m_trade;
4102 m_trade = nullptr;
4103 delete trader->m_trade;
4104 trader->m_trade = nullptr;
4105 }
4106}
void SendCancelTrade()
Definition TradeHandler.cpp:529

References GetSession(), TradeData::GetTrader(), m_trade, and WorldSession::SendCancelTrade().

Referenced by ActivateTaxiPathTo(), CleanupsBeforeDelete(), WorldSession::HandleCancelTradeOpcode(), and WorldSession::HandleSocketClosed().

◆ UninviteFromGroup()

void Player::UninviteFromGroup ( )
  • If the player is invited, remove him. If the group if then only 1 person, disband the group.
2341{
2342 Group* group = GetGroupInvite();
2343 if (!group)
2344 return;
2345
2346 group->RemoveInvite(this);
2347
2348 if (group->IsCreated())
2349 {
2350 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2351 {
2352 group->Disband(true);
2353 group = nullptr; // gets deleted in disband
2354 }
2355 }
2356 else
2357 {
2358 if (group->GetInviteeCount() <= 1)
2359 {
2360 group->RemoveAllInvites();
2361 delete group;
2362 group = nullptr;
2363 }
2364 }
2365}
bool IsCreated() const
Definition Group.cpp:2282
void RemoveAllInvites()
Definition Group.cpp:359
void Disband(bool hideDestroy=false)
Definition Group.cpp:751
void RemoveInvite(Player *player)
Definition Group.cpp:349
uint32 GetInviteeCount() const
Definition Group.h:246
Group * GetGroupInvite()
Definition Player.h:2474

References Group::Disband(), GetGroupInvite(), Group::GetInviteeCount(), Group::GetMembersCount(), Group::IsCreated(), Group::RemoveAllInvites(), and Group::RemoveInvite().

Referenced by WorldSession::HandleGroupDeclineOpcode(), and WorldSession::LogoutPlayer().

◆ UnsummonPetTemporaryIfAny()

void Player::UnsummonPetTemporaryIfAny ( )

◆ Update()

void Player::Update ( uint32  time)
overridevirtual
Todo:
add weapon, skill check

Reimplemented from WorldObject.

54{
55 if (!IsInWorld())
56 return;
57
58 sScriptMgr->OnBeforePlayerUpdate(this, p_time);
59
60 // undelivered mail
62 {
65
66 // It will be recalculate at mailbox open (for unReadMails important
67 // non-0 until mailbox open, it also will be recalculated)
68 m_nextMailDelivereTime = time_t(0);
69 }
70
71 // Update cinematic location, if 500ms have passed and we're doing a
72 // cinematic now.
75 {
78 }
79
80 // used to implement delayed far teleports
83 Unit::Update(p_time);
85
86 time_t now = GameTime::GetGameTime().count();
87
88 UpdatePvPFlag(now);
90
91 UpdateContestedPvP(p_time);
92
93 UpdateDuelFlag(now);
94
96
97 UpdateAfkReport(now);
98
99 // Xinef: update charm AI only if we are controlled by creature or
100 // non-posses player charm
102 {
103 m_charmUpdateTimer += p_time;
104 if (m_charmUpdateTimer >= 1000)
105 {
107 if (Unit* charmer = GetCharmer())
108 if (charmer->IsAlive())
110 }
111 }
112
113 time_t lastTick = m_Last_tick;
114 if (now > m_Last_tick)
115 {
116 // Update items that have just a limited lifetime
118
119 // check every minute, less chance to crash and wont break anything.
121
122 // Played time
123 uint32 elapsed = uint32(now - m_Last_tick);
124 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
125 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
126 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
127 m_Last_tick = now;
128 }
129
130 // If mute expired, remove it from the DB
131 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
132 {
133 GetSession()->m_muteTime = 0;
135 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
136 stmt->SetData(0, 0); // Set the mute time to 0
137 stmt->SetData(1, "");
138 stmt->SetData(2, "");
139 stmt->SetData(3, GetSession()->GetAccountId());
140 LoginDatabase.Execute(stmt);
141 }
142
143 if (!m_timedquests.empty())
144 {
145 QuestSet::iterator iter = m_timedquests.begin();
146 while (iter != m_timedquests.end())
147 {
148 QuestStatusData& q_status = m_QuestStatus[*iter];
149 if (q_status.Timer <= p_time)
150 {
151 uint32 quest_id = *iter;
152 ++iter; // current iter will be removed in FailQuest
153 FailQuest(quest_id);
154 }
155 else
156 {
157 q_status.Timer -= p_time;
158 m_QuestStatusSave[*iter] = true;
159 ++iter;
160 }
161 }
162 }
163
164 m_achievementMgr->Update(p_time);
165
167 {
168 if (Unit* victim = GetVictim())
169 {
170 // default combat reach 10
172
174 {
175 if (!IsWithinMeleeRange(victim))
176 {
178 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
179 {
181 m_swingErrorMsg = 1;
182 }
183 }
184 // 120 degrees of radiant range
185 else if (!HasInArc(2 * M_PI / 3, victim))
186 {
188 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
189 {
191 m_swingErrorMsg = 2;
192 }
193 }
194 else
195 {
196 m_swingErrorMsg = 0; // reset swing error state
197
198 // prevent base and off attack in same time, delay attack at
199 // 0.2 sec
203
204 // do attack
207 }
208 }
209
211 {
212 if (!IsWithinMeleeRange(victim))
214 else if (!HasInArc(2 * M_PI / 3, victim))
216 else
217 {
218 // prevent base and off attack in same time, delay attack at
219 // 0.2 sec
222
223 // do attack
226 }
227 }
228
229 /*Unit* owner = victim->GetOwner();
230 Unit* u = owner ? owner : victim;
231 if (u->IsPvP() && (!duel || duel->opponent != u))
232 {
233 UpdatePvP(true);
234 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
235 }*/
236 }
237 }
238
240 {
241 if (now > lastTick && _restTime > 0) // freeze update
242 {
243 time_t currTime = GameTime::GetGameTime().count();
244 time_t timeDiff = currTime - _restTime;
245 if (timeDiff >= 10) // freeze update
246 {
247 _restTime = currTime;
248
249 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
250 float extraPerSec =
251 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
252 bubble;
253
254 // speed collect rest bonus (section/in hour)
255 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
256 }
257 }
258 }
259
260 if (m_weaponChangeTimer > 0)
261 {
262 if (p_time >= m_weaponChangeTimer)
264 else
265 m_weaponChangeTimer -= p_time;
266 }
267
268 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
269 {
270 LOG_INFO("misc", "Player::Update - invalid position ({:0.1f}, {:0.1f}, {:0.1f})! Map: {}, MapId: {}, {}",
272 GetSession()->KickPlayer("Invalid position");
273 return;
274 }
275
276 if (m_zoneUpdateTimer > 0)
277 {
278 if (p_time >= m_zoneUpdateTimer)
279 {
280 // On zone update tick check if we are still in an inn if we are
281 // supposed to be in one
283 {
284 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
285 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
286 {
288 }
289 }
290
291 uint32 newzone, newarea;
292 GetZoneAndAreaId(newzone, newarea);
293
294 if (m_zoneUpdateId != newzone)
295 UpdateZone(newzone, newarea); // also update area
296 else
297 {
298 // use area updates as well
299 // needed for free far all arenas for example
300 if (m_areaUpdateId != newarea)
301 UpdateArea(newarea);
302 }
303
305 }
306 else
307 m_zoneUpdateTimer -= p_time;
308 }
309
310 sScriptMgr->OnPlayerUpdate(this, p_time);
311
312 if (IsAlive())
313 {
314 m_regenTimer += p_time;
316 }
317
319 KillPlayer();
320
321 if (m_nextSave)
322 {
323 if (p_time >= m_nextSave)
324 {
325 // m_nextSave reset in SaveToDB call
326 SaveToDB(false, false);
327 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
328 }
329 else
330 {
331 m_nextSave -= p_time;
332 }
333 }
334
335 // Handle Water/drowning
336 HandleDrowning(p_time);
337
338 if (GetDrunkValue())
339 {
340 m_drunkTimer += p_time;
343 }
344
345 if (HasPendingBind())
346 {
347 if (_pendingBindTimer <= p_time)
348 {
349 // Player left the instance
352 SetPendingBind(0, 0);
353 }
354 else
355 _pendingBindTimer -= p_time;
356 }
357
358 // not auto-free ghost from body in instances
359 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
361 {
362 if (p_time >= m_deathTimer)
363 {
364 m_deathTimer = 0;
367 }
368 else
369 m_deathTimer -= p_time;
370 }
371
372 UpdateEnchantTime(p_time);
373 UpdateHomebindTime(p_time);
374
375 if (!_instanceResetTimes.empty())
376 {
377 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
378 itr != _instanceResetTimes.end();)
379 {
380 if (itr->second < now)
381 _instanceResetTimes.erase(itr++);
382 else
383 ++itr;
384 }
385 }
386
387 // group update
389
390 Pet* pet = GetPet();
391 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
392 !pet->isPossessed())
393 // if (pet && !pet->IsWithinDistInMap(this,
394 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
395 // (pet->GetGUID()
396 // != GetCharmGUID())))
398
399 // pussywizard:
400 if (m_hostileReferenceCheckTimer <= p_time)
401 {
403 if (!GetMap()->IsDungeon())
406 }
407 else
409
410 // we should execute delayed teleports only for alive(!) players
411 // because we don't want player's ghost teleported from graveyard
412 // xinef: so we store it to the end of the world and teleport out of the ass
413 // after resurrection?
414 if (HasDelayedTeleport() /* && IsAlive()*/)
415 {
418 }
419
421 {
423 UpdateObjectVisibility(true, true);
426 }
427}
constexpr auto CINEMATIC_UPDATEDIFF
Definition CinematicMgr.h:26
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition DatabaseEnv.cpp:22
@ RATE_REST_INGAME
Definition IWorld.h:502
@ LOGIN_UPD_MUTE_TIME
Definition LoginDatabase.h:72
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:68
constexpr auto ZONE_UPDATE_INTERVAL
Definition PlayerUpdates.cpp:51
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
@ UNIT_STATE_CHARGING
Definition UnitDefines.h:187
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:274
#define ATTACK_DISPLAY_DELAY
Definition Unit.h:630
void Update(uint32 timeDiff)
Definition AchievementMgr.cpp:2188
std::vector< FlyByCamera > const * m_cinematicCamera
Definition CinematicMgr.h:56
uint32 m_cinematicDiff
Definition CinematicMgr.h:52
uint32 m_lastCinematicCheck
Definition CinematicMgr.h:53
uint32 m_activeCinematicCameraId
Definition CinematicMgr.h:54
void UpdateCinematicLocation(uint32 diff)
Definition CinematicMgr.cpp:92
void deleteReferencesOutOfRange(float range)
Definition HostileRefMgr.cpp:199
void UpdateEnchantTime(uint32 time)
Definition PlayerStorage.cpp:4162
uint32 GetInnTriggerId() const
Definition Player.h:1217
void UpdateContestedPvP(uint32 currTime)
Definition PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition Player.cpp:11741
void KillPlayer()
Definition Player.cpp:4572
void UpdateDuelFlag(time_t currTime)
Definition PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition Player.h:1214
bool HasDelayedTeleport() const
Definition Player.h:2955
void SendAttackSwingNotInRange()
Definition PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition PlayerStorage.cpp:4108
void RemoveRestFlag(RestFlag restFlag)
Definition Player.cpp:16201
void CheckDuelDistance(time_t currTime)
Definition Player.cpp:6403
void UpdatePvPFlag(time_t currTime)
Definition PlayerMisc.cpp:372
void HandleSobering()
The player sobers by 1% every 9 seconds.
Definition Player.cpp:952
void UpdateFFAPvPFlag(time_t currTime)
Definition PlayerMisc.cpp:391
void BindToInstance()
Definition PlayerStorage.cpp:6508
void FailQuest(uint32 quest_id)
Definition PlayerQuest.cpp:886
void ProcessSpellQueue()
Definition PlayerUpdates.cpp:2368
void HandleDrowning(uint32 time_diff)
Definition Player.cpp:835
void UpdateCharmedAI()
Definition PlayerUpdates.cpp:1946
void UpdateHomebindTime(uint32 time)
Definition PlayerUpdates.cpp:1389
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition Player.cpp:2207
void RegenerateAll()
Definition Player.cpp:1757
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition PlayerMisc.cpp:351
bool HasOffhandWeaponForAttack() const
Definition Unit.h:943
bool IsCharmed() const
Definition Unit.h:1244
Unit * GetCharmer() const
Definition Unit.cpp:10667
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:844
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition Unit.cpp:664
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2026
bool isPossessed() const
Definition Unit.h:1245
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2576
void Update(uint32 time) override
Definition Unit.cpp:382
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:846
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:847
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:642
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2024
void RemoveFromNotify(uint16 f)
Definition Object.h:573
void SetTotalTime(uint32 TotalTime)
Definition WorldSession.h:389
void KickPlayer(bool setKicked=true)
Definition WorldSession.h:414
Definition ObjectMgr.h:420
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:141

References _cinematicMgr, _instanceResetTimes, _pendingBindId, _pendingBindTimer, _restTime, ATTACK_DISPLAY_DELAY, Unit::AttackerStateUpdate(), BASE_ATTACK, BindToInstance(), Unit::bRequestForcedVisibilityUpdate, BuildPlayerRepop(), CheckDuelDistance(), CINEMATIC_UPDATEDIFF, HostileRefMgr::deleteReferencesOutOfRange(), FailQuest(), WorldObject::FindMap(), Unit::getAttackTimer(), Unit::GetCharmer(), GetDrunkValue(), GameTime::GetGameTime(), Object::GetGUID(), Unit::getHostileRefMgr(), GetInnTriggerId(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), getMSTime(), GetMSTimeDiffToNow(), WorldObject::GetName(), GetPet(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetRestBonus(), GetSession(), Object::GetUInt32Value(), Unit::GetVictim(), WorldObject::GetVisibilityRange(), WorldObject::GetZoneAndAreaId(), HandleDrowning(), HandleSobering(), HasDelayedTeleport(), Position::HasInArc(), Unit::HasOffhandWeaponForAttack(), HasPendingBind(), HasPlayerFlag(), Unit::HasPreventResurectionAura(), HasRestFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), IN_MILLISECONDS, Unit::IsAlive(), Unit::isAttackReady(), IsBeingTeleported(), Unit::IsCharmed(), IsInAreaTriggerRadius(), Object::IsInWorld(), Position::IsPositionValid(), Unit::isPossessed(), WorldObject::IsWithinDistInMap(), Unit::IsWithinMeleeRange(), JustDied, WorldSession::KickPlayer(), KillPlayer(), LOG_DEBUG, LOG_INFO, LOGIN_UPD_MUTE_TIME, LoginDatabase, m_achievementMgr, CinematicMgr::m_activeCinematicCameraId, m_areaUpdateId, m_charmUpdateTimer, CinematicMgr::m_cinematicCamera, CinematicMgr::m_cinematicDiff, Unit::m_deathState, m_deathTimer, Unit::m_delayed_unit_relocation_timer, m_drunkTimer, m_hostileReferenceCheckTimer, m_Last_tick, CinematicMgr::m_lastCinematicCheck, WorldSession::m_muteTime, m_nextMailDelivereTime, m_nextSave, m_Played_time, m_QuestStatus, m_QuestStatusSave, Unit::m_regenTimer, m_swingErrorMsg, m_timedquests, m_weaponChangeTimer, m_zoneUpdateId, m_zoneUpdateTimer, NOTIFY_VISIBILITY_CHANGED, OFF_ATTACK, PET_SAVE_NOT_IN_SLOT, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_FLAGS_RESTING, PLAYER_NEXT_LEVEL_XP, ProcessSpellQueue(), RATE_REST_INGAME, RegenerateAll(), WorldObject::RemoveFromNotify(), RemovePet(), RemoveRestFlag(), RepopAtGraveyard(), Unit::resetAttackTimer(), REST_FLAG_IN_TAVERN, SaveToDB(), SendAttackSwingBadFacingAttack(), SendAttackSwingNotInRange(), SendNewMail(), SendUpdateToOutOfRangeGroupMembers(), Unit::setAttackTimer(), PreparedStatementBase::SetData(), SetHasDelayedTeleport(), SetMustDelayTeleport(), SetPendingBind(), SetRestBonus(), WorldSession::SetTotalTime(), sObjectMgr, sScriptMgr, sWorld, teleportStore_dest, teleportStore_options, TeleportTo(), QuestStatusData::Timer, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_POSSESSED, UNIT_STATE_CASTING, UNIT_STATE_CHARGING, UNIT_STATE_MELEE_ATTACKING, unReadMails, Unit::Update(), AchievementMgr::Update(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2173{
2174 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2175 unit);
2176}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition AchievementMgr.cpp:822

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), InstanceScript::DoUpdateAchievementCriteria(), DuelComplete(), EnvironmentalDamage(), EquipItem(), EquipNewItem(), lfg::LFGMgr::FinishDungeon(), GiveLevel(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuyBankSlotOpcode(), HandleFall(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleQuestLogRemoveQuest(), reset_commandscript::HandleResetHonorCommand(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleTextEmoteOpcode(), Unit::Kill(), KilledMonsterCredit(), ArenaTeamMember::ModifyPersonalRating(), MoveItemToInventory(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), InstanceSaveMgr::PlayerBindToInstance(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), SetTitle(), StoreNewItem(), SummonIfPossible(), UpdateLootAchievements(), BattlegroundAB::UpdatePlayerScore(), BattlegroundAV::UpdatePlayerScore(), BattlegroundEY::UpdatePlayerScore(), BattlegroundIC::UpdatePlayerScore(), BattlegroundWS::UpdatePlayerScore(), UpdateSkill(), UpdateSkillPro(), and GameObject::Use().

◆ UpdateAfkReport()

void Player::UpdateAfkReport ( time_t  currTime)

checks the 15 afk reports per 5 minutes limit

352{
353 if (m_bgData.bgAfkReportedTimer <= currTime)
354 {
356 m_bgData.bgAfkReportedTimer = currTime + 5 * MINUTE;
357 }
358}
time_t bgAfkReportedTimer
Definition Player.h:1049

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
704{
705 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
707}
CombatRating
Definition Unit.h:216

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
872{
873 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
875}
@ SPELL_SCHOOL_NORMAL
Definition SharedDefines.h:283
void UpdateSpellCritChance(uint32 school)
Definition StatSystem.cpp:822

References MAX_SPELL_SCHOOL, SPELL_SCHOOL_NORMAL, and UpdateSpellCritChance().

Referenced by AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleModSpellCritChance(), UpdateAllStats(), UpdateRating(), and UpdateStats().

◆ UpdateAllStats()

bool Player::UpdateAllStats ( )
overridevirtual

Implements Unit.

189{
190 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
191 {
192 float value = GetTotalStatValue(Stats(i));
193 SetStat(Stats(i), int32(value));
194 }
195
196 UpdateArmor();
197 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
200
201 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
203
215
216 return true;
217}
void UpdateAllSpellCritChances()
Definition StatSystem.cpp:871
void UpdateArmor() override
Definition StatSystem.cpp:252
void UpdateSpellDamageAndHealingBonus()
Definition StatSystem.cpp:177
void UpdateMaxHealth() override
Definition StatSystem.cpp:296
void UpdateAllRatings()
Definition PlayerUpdates.cpp:703
void UpdateAllCritPercentages()
Definition StatSystem.cpp:680
void UpdateDefenseBonusesMod()
Definition StatSystem.cpp:609
virtual void UpdateAllResistances()
Definition StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition Unit.cpp:15368

References BASE_ATTACK, CR_ARMOR_PENETRATION, Unit::GetTotalStatValue(), MAX_POWERS, MAX_STATS, OFF_ATTACK, POWER_MANA, RecalculateRating(), Unit::SetStat(), STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllRatings(), Unit::UpdateAllResistances(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDefenseBonusesMod(), UpdateExpertise(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

Referenced by _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), Create(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1211{
1212 // pussywizard: inform instance, needed for Icecrown Citadel
1213 if (InstanceScript* instance = GetInstanceScript())
1214 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1215
1216 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1217
1218 // FFA_PVP flags are area and not zone id dependent
1219 // so apply them accordingly
1220 m_areaUpdateId = newArea;
1221
1222 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1223 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1224 UpdateFFAPvPState(false);
1225
1226 UpdateAreaDependentAuras(newArea);
1227
1228 pvpInfo.IsInNoPvPArea = false;
1229 if (area && area->IsSanctuary())
1230 {
1232 pvpInfo.IsInNoPvPArea = true;
1234 }
1235 else
1237
1238 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1241 if (area && area->flags & areaRestFlag)
1243 else
1245}
@ AREA_FLAG_ARENA
Definition DBCEnums.h:241
@ AREA_FLAG_REST_ZONE_HORDE
Definition DBCEnums.h:256
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition DBCEnums.h:257
@ REST_FLAG_IN_FACTION_AREA
Definition Player.h:821
void UpdateFFAPvPState(bool reset=true)
Definition PlayerUpdates.cpp:1449
bool IsSanctuary() const
Definition DBCStructure.h:532
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition Player.h:367
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition Player.h:368

References AREA_FLAG_ARENA, AREA_FLAG_REST_ZONE_ALLIANCE, AREA_FLAG_REST_ZONE_HORDE, Unit::CombatStopWithPets(), AreaTableEntry::flags, WorldObject::GetInstanceScript(), GetTeamId(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_areaUpdateId, pvpInfo, Object::RemoveByteFlag(), RemoveRestFlag(), REST_FLAG_IN_FACTION_AREA, sAreaTableStore, Object::SetByteFlag(), SetRestFlag(), sScriptMgr, TEAM_ALLIANCE, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_BYTES_2, UpdateAreaDependentAuras(), and UpdateFFAPvPState().

Referenced by SetGameMaster(), Update(), and UpdateZone().

◆ UpdateAreaDependentAuras()

void Player::UpdateAreaDependentAuras ( uint32  area_id)
1860{
1861 // remove auras from spells with area limitations
1862 for (AuraMap::iterator iter = m_ownedAuras.begin();
1863 iter != m_ownedAuras.end();)
1864 {
1865 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1866 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1867 if (iter->second->GetSpellInfo()->CheckLocation(
1868 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1870 RemoveOwnedAura(iter);
1871 else
1872 ++iter;
1873 }
1874
1875 // Xinef: check controlled auras
1876 if (!m_Controlled.empty())
1877 for (ControlSet::iterator itr = m_Controlled.begin();
1878 itr != m_Controlled.end();)
1879 {
1880 Unit* controlled = *itr;
1881 ++itr;
1882 if (controlled && !controlled->IsPet())
1883 {
1884 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1885 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1886 auraIter != tAuras.end();)
1887 {
1888 if (auraIter->second->GetSpellInfo()->CheckLocation(
1889 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1891 controlled->RemoveOwnedAura(auraIter);
1892 else
1893 ++auraIter;
1894 }
1895 }
1896 }
1897
1898 // some auras applied at subzone enter
1899 SpellAreaForAreaMapBounds saBounds =
1900 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1901 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1902 itr != saBounds.second; ++itr)
1903 if (itr->second->autocast &&
1904 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1905 if (!HasAura(itr->second->spellId))
1906 CastSpell(this, itr->second->spellId, true);
1907
1908 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1909 {
1910 switch (GetVehicleBase()->GetEntry())
1911 {
1912 case 33062:
1913 case 33109:
1914 case 33060:
1915 GetVehicle()->Dismiss();
1916 break;
1917 }
1918 }
1919}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition SpellMgr.h:550
Unit * GetVehicleBase() const
Definition Unit.cpp:18808
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:641
AuraMap & GetOwnedAuras()
Definition Unit.h:1303
void Dismiss()
Definition Vehicle.cpp:538

References Unit::CastSpell(), Vehicle::Dismiss(), Object::GetEntry(), WorldLocation::GetMapId(), Unit::GetOwnedAuras(), Position::GetPositionX(), Unit::GetVehicle(), Unit::GetVehicleBase(), Unit::HasAura(), Unit::IsPet(), Unit::m_Controlled, Unit::m_ownedAuras, m_zoneUpdateId, Unit::RemoveOwnedAura(), SPELL_CAST_OK, and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), and UpdateArea().

◆ UpdateArmor()

void Player::UpdateArmor ( )
overridevirtual

Implements Unit.

253{
254 UnitMods unitMod = UNIT_MOD_ARMOR;
255
256 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
257 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
258 value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
259 value += GetModifierValue(unitMod, TOTAL_VALUE);
260
261 //add dynamic flat mods
263 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
264 {
265 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
266 value += CalculatePct(GetStat(Stats((*i)->GetMiscValueB())), (*i)->GetAmount());
267 }
268
269 value *= GetModifierValue(unitMod, TOTAL_PCT);
270
271 SetArmor(int32(value));
272
273 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
274}
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:245

References BASE_PCT, BASE_VALUE, CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetArmor(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_MASK_NORMAL, STAT_AGILITY, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, and UpdateAttackPowerAndDamage().

Referenced by UpdateAllStats(), UpdateResistances(), and UpdateStats().

◆ UpdateArmorPenetration()

void Player::UpdateArmorPenetration ( int32  amount)
848{
849 // Store Rating Value
851}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Unit::SetUInt32Value().

Referenced by UpdateRating().

◆ UpdateAttackPowerAndDamage()

void Player::UpdateAttackPowerAndDamage ( bool  ranged = false)
overridevirtual

Implements Unit.

331{
332 float val2 = 0.0f;
333 float level = float(GetLevel());
334
335 sScriptMgr->OnBeforeUpdateAttackPowerAndDamage(this, level, val2, ranged);
336
338
342
343 if (ranged)
344 {
348
350 {
351 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
352 }
354 {
355 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
356 }
358 {
359 switch (GetShapeshiftForm())
360 {
361 case FORM_CAT:
362 case FORM_BEAR:
363 case FORM_DIREBEAR:
364 val2 = 0.0f;
365 break;
366 default:
367 val2 = GetStat(STAT_AGILITY) - 10.0f;
368 break;
369 }
370 }
371 else
372 {
373 val2 = GetStat(STAT_AGILITY) - 10.0f;
374 }
375 }
376 else
377 {
379 {
380 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
381 }
383 {
384 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
385 }
387 {
388 // Check if Predatory Strikes is skilled
389 float mLevelMult = 0.0f;
390 float weapon_bonus = 0.0f;
391 if (IsInFeralForm())
392 {
394 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
395 {
396 AuraEffect* aurEff = *itr;
397 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
398 {
399 switch (aurEff->GetEffIndex())
400 {
401 case 0: // Predatory Strikes (effect 0)
402 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
403 break;
404 case 1: // Predatory Strikes (effect 1)
405 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
406 {
407 // also gains % attack power from equipped weapon
408 ItemTemplate const* proto = mainHand->GetTemplate();
409 if (!proto)
410 continue;
411
412 uint32 ap = proto->getFeralBonus();
413 // Get AP Bonuses from weapon
414 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
415 {
416 if (i >= proto->StatsCount)
417 break;
418
420 ap += proto->ItemStat[i].ItemStatValue;
421 }
422
423 // Get AP Bonuses from weapon spells
424 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
425 {
426 // no spell
427 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
428 continue;
429
430 // check if it is valid spell
431 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
432 if (!spellproto)
433 continue;
434
435 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
436 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
437 ap += spellproto->Effects[j].CalcValue();
438 }
439
440 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
441 }
442 break;
443 default:
444 break;
445 }
446 }
447 }
448 }
449
450 switch (GetShapeshiftForm())
451 {
452 case FORM_CAT:
453 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
454 break;
455 case FORM_BEAR:
456 case FORM_DIREBEAR:
457 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
458 break;
459 case FORM_MOONKIN:
460 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
461 break;
462 default:
463 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
464 break;
465 }
466 }
468 {
469 val2 = GetStat(STAT_STRENGTH) - 10.0f;
470 }
471 }
472
473 SetModifierValue(unitMod, BASE_VALUE, val2);
474
475 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
476 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
477
478 //add dynamic flat mods
479 if (ranged)
480 {
481 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
482 {
484 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
485 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
486 }
487 }
488 else
489 {
491 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
492 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
493
495 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
496 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
497 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
498 }
499
500 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
501
502 sScriptMgr->OnAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
503 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
504 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
505 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
506
507 //automatically update weapon damage after attack power modification
508 if (ranged)
509 {
511 }
512 else
513 {
515 if (CanDualWield() && HasOffhandWeaponForAttack()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
519 }
520}
@ SPELL_AURA_MOD_ATTACK_POWER
Definition SpellAuraDefines.h:162
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
Definition SpellAuraDefines.h:275
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
Definition SpellAuraDefines.h:348
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
Definition SpellAuraDefines.h:331
@ FORM_MOONKIN
Definition UnitDefines.h:98
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition Unit.h:1022
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition ItemTemplate.h:648
int32 getFeralBonus(int32 extraDPS=0) const
Definition ItemTemplate.h:744
uint32 StatsCount
Definition ItemTemplate.h:647
int32 ItemStatValue
Definition ItemTemplate.h:587
uint32 ItemStatType
Definition ItemTemplate.h:586

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), CLASS_CONTEXT_STATS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CLASSMASK_WAND_USERS, SpellInfo::Effects, EQUIPMENT_SLOT_MAINHAND, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, AuraEffect::GetAmount(), Unit::GetArmor(), Unit::GetAuraEffectsByType(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::HasOffhandWeaponForAttack(), IsClass(), Unit::IsInFeralForm(), ITEM_MOD_ATTACK_POWER, ITEM_SPELLTRIGGER_ON_EQUIP, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, m_baseFeralAP, m_items, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_SPELL_EFFECTS, OFF_ATTACK, RANGED_ATTACK, Object::SetFloatValue(), Object::SetInt32Value(), Unit::SetModifierValue(), SPELL_AURA_DUMMY, SPELL_AURA_MOD_ATTACK_POWER, SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SpellInfo::SpellIconID, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellMgr, STAT_AGILITY, STAT_STRENGTH, ItemTemplate::StatsCount, TOTAL_PCT, TOTAL_VALUE, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, Unit::UpdateDamagePhysical(), and UpdateSpellDamageAndHealingBonus().

Referenced by ApplyFeralAPBonus(), AuraEffect::HandleAuraModAttackPowerOfArmor(), AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(), InitDataForForm(), UpdateAllStats(), UpdateArmor(), and UpdateStats().

◆ UpdateBlockPercentage()

void Player::UpdateBlockPercentage ( )
617{
618 // No block
619 float value = 0.0f;
620 if (CanBlock())
621 {
622 // Base value
623 value = 5.0f;
624 // Modify value from defense skill
625 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
626 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
628 // Increase from rating
630
631 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
632 {
633 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
634 }
635
636 value = value < 0.0f ? 0.0f : value;
637 }
639}
#define sConfigMgr
Definition Config.h:74
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:790
bool CanBlock() const
Definition Player.h:2193
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3640

References CanBlock(), CR_BLOCK, Unit::GetDefenseSkillValue(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), Unit::GetTotalAuraModifier(), PLAYER_BLOCK_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), and SPELL_AURA_MOD_BLOCK_PERCENT.

Referenced by AuraEffect::HandleAuraModBlockPercent(), SetCanBlock(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdateCharmedAI()

void Player::UpdateCharmedAI ( )
private
1947{
1948 // Xinef: maybe passed as argument?
1949 Unit* charmer = GetCharmer();
1950 CharmInfo* charmInfo = GetCharmInfo();
1951
1952 // Xinef: needs more thinking, maybe kill player?
1953 if (!charmer || !charmInfo)
1954 return;
1955
1956 // Xinef: we should be killed if caster enters evade mode and charm is
1957 // infinite
1958 if (charmer->IsCreature() &&
1959 charmer->ToCreature()->IsInEvadeMode())
1960 {
1961 AuraEffectList const& auras =
1963 for (AuraEffectList::const_iterator iter = auras.begin();
1964 iter != auras.end(); ++iter)
1965 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1966 (*iter)->GetBase()->IsPermanent())
1967 {
1968 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1970 nullptr, false);
1971 return;
1972 }
1973 }
1974
1975 Unit* target = GetVictim();
1976 if (target)
1977 {
1978 SetInFront(target);
1980 }
1981
1983 return;
1984
1985 bool Mages =
1986 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1987 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1988 1 << (CLASS_PRIEST - 1));
1989
1990 // Xinef: charmer type specific actions
1991 if (charmer->IsPlayer())
1992 {
1993 bool follow = false;
1994 if (!target)
1995 {
1996 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
1997 follow = true;
1998 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
1999 {
2000 if (charmer->GetVictim())
2001 target = charmer->GetVictim();
2002 else
2003 follow = true;
2004 }
2005
2006 if (follow)
2007 {
2011 return;
2012 }
2013 }
2014 else if (target &&
2017 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2018 }
2019
2020 if (!target || !IsValidAttackTarget(target))
2021 {
2022 target = SelectNearbyTarget(nullptr, GetMap()->IsDungeon() ? 100.f : 30.f);
2023 if (!target)
2024 {
2028
2029 return;
2030 }
2031
2032 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2033 Attack(target, true);
2034 }
2035 else
2036 {
2037 float Distance = GetDistance(target);
2038 uint8 rnd = urand(0, 1);
2039
2040 if (Mages)
2041 {
2042 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2043 {
2044 GetMotionMaster()->MoveChase(target, 4);
2045 return;
2046 }
2047
2048 if (Distance <= 3)
2049 {
2050 if (urand(0, 1))
2051 {
2054 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2059 false);
2060 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2063 }
2064 else
2065 {
2066 switch (urand(0, 1))
2067 {
2068 case 0:
2072 CastSpell(
2073 target,
2075 false);
2076 break;
2077 case 1:
2082 false);
2083 break;
2084 }
2085 }
2086 }
2087 else
2088 {
2089 switch (urand(0, 2))
2090 {
2091 case 0:
2095 CastSpell(target,
2097 false);
2098 break;
2099 case 1:
2103 CastSpell(target,
2105 false);
2106 break;
2107 case 2:
2111 false);
2112 break;
2113 }
2114 }
2115 }
2116 else
2117 {
2118 if (Distance > 10)
2119 {
2120 GetMotionMaster()->MoveChase(target, 2.0f);
2123 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2124 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2127 }
2128
2130 return;
2131
2132 switch (urand(0, 2))
2133 {
2134 case 0:
2138 CastSpell(target,
2140 false);
2141 break;
2142 case 1:
2147 false);
2148 break;
2149 case 2:
2153 break;
2154 }
2155 }
2156 }
2157}
@ CHASE_MOTION_TYPE
Definition MotionMaster.h:45
#define PET_FOLLOW_ANGLE
Definition PetDefines.h:203
#define PET_FOLLOW_DIST
Definition PetDefines.h:202
@ SPELL_HIGH_DAMAGE1
Definition Player.h:924
@ UNIT_STATE_FOLLOW
Definition UnitDefines.h:179
@ REACT_DEFENSIVE
Definition Unit.h:549
@ REACT_PASSIVE
Definition Unit.h:548
bool IsInEvadeMode() const
Definition Creature.h:134
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:313
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:913
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:409
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition Unit.cpp:17050
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10326
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:16770
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13937
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20587
ReactStates GetPlayerReactState() const
Definition CharmInfo.h:184

References Unit::Attack(), Unit::CastSpell(), CHASE_MOTION_TYPE, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PRIEST, CLASS_WARLOCK, Unit::DealDamage(), DIRECT_DAMAGE, Unit::GetAuraEffectsByType(), Unit::GetCharmer(), Unit::GetCharmInfo(), Unit::getClassMask(), MotionMaster::GetCurrentMovementGeneratorType(), WorldObject::GetDistance(), Object::GetGUID(), Unit::GetHealth(), WorldObject::GetMap(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Object::IsCreature(), Creature::IsInEvadeMode(), Object::IsPlayer(), Unit::IsValidAttackTarget(), m_charmAISpells, MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_ANGLE, PET_FOLLOW_DIST, POWER_MANA, REACT_DEFENSIVE, REACT_PASSIVE, Unit::SelectNearbyTarget(), Unit::SendMovementFlagUpdate(), Unit::SetInFront(), SPELL_AURA_MOD_CHARM, SPELL_DOT_DAMAGE, SPELL_FAST_RUN, SPELL_HIGH_DAMAGE1, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_ROOT_OR_FEAR, SPELL_SCHOOL_MASK_NORMAL, SPELL_T_CHARGE, SPELL_T_STUN, Object::ToCreature(), UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
1021{
1022 uint8 playerLevel = GetLevel();
1023 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
1024 uint16 currentSkillMax = 5 * playerLevel;
1025 int32 skillDiff = currentSkillMax - currentSkillValue;
1026
1027 // Max skill reached for level.
1028 // Can in some cases be less than 0: having max skill and then .level -1 as example.
1029 if (skillDiff <= 0)
1030 {
1031 return;
1032 }
1033
1034 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
1035 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
1036 /*if (moblevel < greylevel)
1037 return;*/
1038 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
1039
1040 if (moblevel > playerLevel + 5)
1041 {
1042 moblevel = playerLevel + 5;
1043 }
1044
1045 int16 lvldif = moblevel - greylevel;
1046 if (lvldif < 3)
1047 {
1048 lvldif = 3;
1049 }
1050
1051 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1052 if (!defence)
1053 {
1054 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1055 }
1056
1057 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1058
1059 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1060
1061 if (roll_chance_f(chance))
1062 {
1063 if (defence)
1064 {
1065 UpdateDefense();
1066 }
1067 else
1068 {
1069 UpdateWeaponSkill(victim, attType, item);
1070 }
1071 }
1072}
uint32 GetBaseDefenseSkillValue() const
Definition Player.h:1942
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition Player.cpp:12852
void UpdateDefense()
Definition PlayerUpdates.cpp:604
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition PlayerUpdates.cpp:974
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1034

References GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Unit::getLevelForTarget(), Unit::GetStat(), LOG_DEBUG, roll_chance_f(), STAT_INTELLECT, UpdateDefense(), and UpdateWeaponSkill().

Referenced by Unit::ProcDamageAndSpellFor().

◆ UpdateContestedPvP()

void Player::UpdateContestedPvP ( uint32  currTime)
361{
363 return;
364 if (m_contestedPvPTimer <= diff)
365 {
367 }
368 else
369 m_contestedPvPTimer -= diff;
370}

References Unit::IsInCombat(), m_contestedPvPTimer, and ResetContestedPvP().

Referenced by Update().

◆ UpdateCorpseReclaimDelay()

void Player::UpdateCorpseReclaimDelay ( )
1922{
1924
1925 if ((pvp &&
1927 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1928 return;
1929
1930 time_t now = GameTime::GetGameTime().count();
1931
1932 if (now < m_deathExpireTime)
1933 {
1934 // full and partly periods 1..3
1935 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1936
1937 if (count < MAX_DEATH_COUNT)
1938 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1939 else
1941 }
1942 else
1944}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by KillPlayer().

◆ UpdateCraftSkill()

bool Player::UpdateCraftSkill ( uint32  spellid)
822{
823 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
824
825 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
826
827 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
828 _spell_idx != bounds.second; ++_spell_idx)
829 {
830 if (_spell_idx->second->SkillLine)
831 {
832 uint32 SkillValue =
833 GetPureSkillValue(_spell_idx->second->SkillLine);
834
835 // Alchemy Discoveries here
836 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
837 if (spellInfo && spellInfo->Mechanic == MECHANIC_DISCOVERY)
838 {
839 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
840 _spell_idx->second->SkillLine, spellid, this))
841 learnSpell(discoveredSpell);
842 }
843
844 uint32 craft_skill_gain =
845 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
846 sScriptMgr->OnUpdateCraftingSkill(this, _spell_idx->second, SkillValue, craft_skill_gain);
847
848 return UpdateSkillPro(
849 _spell_idx->second->SkillLine,
850 SkillGainChance(SkillValue,
851 _spell_idx->second->TrivialSkillLineRankHigh,
852 (_spell_idx->second->TrivialSkillLineRankHigh +
853 _spell_idx->second->TrivialSkillLineRankLow) /
854 2,
855 _spell_idx->second->TrivialSkillLineRankLow),
856 craft_skill_gain);
857 }
858 }
859 return false;
860}
@ CONFIG_SKILL_GAIN_CRAFTING
Definition IWorld.h:271
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition PlayerUpdates.cpp:747
@ MECHANIC_DISCOVERY
Definition SharedDefines.h:1353
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition SkillDiscovery.cpp:213
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition PlayerUpdates.cpp:910
uint32 Mechanic
Definition SpellInfo.h:323

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sScriptMgr, sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
642{
643 BaseModGroup modGroup;
644 uint16 index;
645 CombatRating cr;
646
647 switch (attType)
648 {
649 case OFF_ATTACK:
650 modGroup = OFFHAND_CRIT_PERCENTAGE;
652 cr = CR_CRIT_MELEE;
653 break;
654 case RANGED_ATTACK:
655 modGroup = RANGED_CRIT_PERCENTAGE;
657 cr = CR_CRIT_RANGED;
658 break;
659 case BASE_ATTACK:
660 default:
661 modGroup = CRIT_PERCENTAGE;
663 cr = CR_CRIT_MELEE;
664 break;
665 }
666
667 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
668 // Modify crit from weapon skill and maximized defense skill of same level victim difference
669 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
670
671 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
672 {
673 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
674 }
675
676 value = value < 0.0f ? 0.0f : value;
677 SetStatFloatValue(index, value);
678}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition Player.h:2204
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3805

References BASE_ATTACK, CR_CRIT_MELEE, CR_CRIT_RANGED, CRIT_PERCENTAGE, GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetTotalPercentageModValue(), Unit::GetWeaponSkillValue(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, sConfigMgr, and Object::SetStatFloatValue().

Referenced by HandleBaseModValue(), UpdateAllCritPercentages(), and UpdateRating().

◆ UpdateDefense()

void Player::UpdateDefense ( )
605{
607 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
608 UpdateDefenseBonusesMod(); // update dependent from defense skill part
609}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition IWorld.h:272
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition PlayerUpdates.cpp:710

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
782{
783 const float dodge_cap[MAX_CLASSES] =
784 {
785 88.129021f, // Warrior
786 88.129021f, // Paladin
787 145.560408f, // Hunter
788 145.560408f, // Rogue
789 150.375940f, // Priest
790 88.129021f, // DK
791 145.560408f, // Shaman
792 150.375940f, // Mage
793 150.375940f, // Warlock
794 0.0f, // ??
795 116.890707f // Druid
796 };
797
798 float diminishing = 0.0f, nondiminishing = 0.0f;
799 GetDodgeFromAgility(diminishing, nondiminishing);
800 // Modify value from defense skill (only bonus from defense rating diminishes)
801 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
802 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
803 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
805 // Dodge from rating
806 diminishing += GetRatingBonusValue(CR_DODGE);
807 // apply diminishing formula to diminishing dodge chance
808 uint32 pclass = getClass() - 1;
809 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
810
811 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
812 float value = std::max(diminishing + nondiminishing, 0.0f);
813
814 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
815 {
816 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
817 }
818
820}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition Player.cpp:5133

References CR_DEFENSE_SKILL, CR_DODGE, Unit::getClass(), GetDodgeFromAgility(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realDodge, MAX_CLASSES, PLAYER_DODGE_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_DODGE_PERCENT.

Referenced by AuraEffect::HandleAuraModDodgePercent(), UpdateDefenseBonusesMod(), UpdateRating(), and UpdateStats().

◆ UpdateDuelFlag()

void Player::UpdateDuelFlag ( time_t  currTime)
424{
425 if (duel && duel->State == DUEL_STATE_COUNTDOWN && duel->StartTime <= currTime)
426 {
427 sScriptMgr->OnPlayerDuelStart(this, duel->Opponent);
428
430 duel->Opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 2);
431
433 duel->Opponent->duel->State = DUEL_STATE_IN_PROGRESS;
434 }
435}
@ DUEL_STATE_COUNTDOWN
Definition Player.h:376
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:377

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Unit::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4735{
4736 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4737 {
4738 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4739 }
4740}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4163{
4164 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4165 {
4166 ASSERT(itr->item);
4167 next = itr;
4168 if (!itr->item->GetEnchantmentId(itr->slot))
4169 {
4170 next = m_enchantDuration.erase(itr);
4171 }
4172 else if (itr->leftduration <= time)
4173 {
4174 ApplyEnchantment(itr->item, itr->slot, false, false);
4175 itr->item->ClearEnchantment(itr->slot);
4176 next = m_enchantDuration.erase(itr);
4177 }
4178 else if (itr->leftduration > time)
4179 {
4180 itr->leftduration -= time;
4181 ++next;
4182 }
4183 }
4184}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1352{
1353 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1354 {
1355 if (m_items[i] && !m_items[i]->IsBroken() &&
1357 {
1358 ApplyItemEquipSpell(m_items[i], false,
1359 true); // remove spells that not fit to form
1361 m_items[i], true,
1362 true); // add spells that fit form but not active
1363 }
1364 }
1365
1366 // item set bonuses not dependent from item broken state
1367 for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1368 {
1369 ItemSetEffect* eff = ItemSetEff[setindex];
1370 if (!eff)
1371 continue;
1372
1373 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1374 {
1375 SpellInfo const* spellInfo = eff->spells[y];
1376 if (!spellInfo)
1377 continue;
1378
1379 ApplyEquipSpell(spellInfo, nullptr, false,
1380 true); // remove spells that not fit to form
1381 if (!sScriptMgr->CanApplyEquipSpellsItemSet(this, eff))
1382 break;
1383 ApplyEquipSpell(spellInfo, nullptr, true,
1384 true); // add spells that fit form but not active
1385 }
1386 }
1387}
#define MAX_ITEM_SET_SPELLS
Definition DBCStructure.h:1228
Definition Item.h:32
SpellInfo const * spells[8]
Definition Item.h:35

References ApplyEquipSpell(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), GetAttackBySlot(), INVENTORY_SLOT_BAG_END, ItemSetEff, m_items, MAX_ITEM_SET_SPELLS, ItemSetEffect::spells, and sScriptMgr.

Referenced by InitDataForForm().

◆ UpdateExpertise()

void Player::UpdateExpertise ( WeaponAttackType  attType)
878{
879 if (attack == RANGED_ATTACK)
880 return;
881
883
884 Item* weapon = GetWeaponForAttack(attack, true);
885
887 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
888 {
889 // item neutral spell
890 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
891 expertise += (*itr)->GetAmount();
892 // item dependent spell
893 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
894 expertise += (*itr)->GetAmount();
895 }
896
897 if (expertise < 0)
898 expertise = 0;
899
900 switch (attack)
901 {
902 case BASE_ATTACK:
904 break;
905 case OFF_ATTACK:
907 break;
908 default:
909 break;
910 }
911}
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303

References BASE_ATTACK, CR_EXPERTISE, Unit::GetAuraEffectsByType(), GetRatingBonusValue(), GetWeaponForAttack(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_EXPERTISE, PLAYER_OFFHAND_EXPERTISE, RANGED_ATTACK, Unit::SetUInt32Value(), and SPELL_AURA_MOD_EXPERTISE.

Referenced by DestroyItem(), EquipItem(), AuraEffect::HandleAuraModExpertise(), RemoveItem(), UpdateAllStats(), and UpdateRating().

◆ UpdateFallInformationIfNeed()

void Player::UpdateFallInformationIfNeed ( MovementInfo const &  minfo,
uint16  opcode 
)
2180{
2181 if (m_lastFallTime >= minfo.fallTime ||
2182 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2183 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2184}
@ MSG_MOVE_FALL_LAND
Definition Opcodes.h:231

References MovementInfo::fallTime, Position::GetPositionZ(), m_lastFallTime, m_lastFallZ, MSG_MOVE_FALL_LAND, MovementInfo::pos, and SetFallInformation().

Referenced by WorldSession::HandleMovementOpcodes().

◆ UpdateFFAPvPFlag()

void Player::UpdateFFAPvPFlag ( time_t  currTime)
392{
393 if (!IsFFAPvP() || sWorld->IsFFAPvPRealm() || !pvpInfo.FFAPvPEndTimer || currTime < pvpInfo.FFAPvPEndTimer + 30)
394 {
395 return;
396 }
397
398 pvpInfo.FFAPvPEndTimer = time_t(0);
400 {
402 sScriptMgr->OnFfaPvpStateUpdate(this, false);
403 }
404 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
405 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
406
407 // xinef: iterate attackers
408 AttackerSet toRemove;
409 AttackerSet const& attackers = getAttackers();
410 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end(); ++itr)
411 if (!(*itr)->IsValidAttackTarget(this))
412 toRemove.insert(*itr);
413
414 for (AttackerSet::const_iterator itr = toRemove.begin(); itr != toRemove.end(); ++itr)
415 (*itr)->AttackStop();
416
417 // xinef: remove our own victim
418 if (Unit* victim = GetVictim())
419 if (!IsValidAttackTarget(victim))
420 AttackStop();
421}
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:638
AttackerSet const & getAttackers() const
Definition Unit.h:859
time_t FFAPvPEndTimer
‍Time when player unflags himself for PvP (flag removed after 5 minutes)
Definition Player.h:370

References Unit::AttackStop(), PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by Update().

◆ UpdateFFAPvPState()

void Player::UpdateFFAPvPState ( bool  reset = true)
Todo:
: should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller
1450{
1452 // and controlled? no, we shouldn't, those are checked for affecting player
1453 // by client
1454 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1455 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1456 {
1457 if (!IsFFAPvP())
1458 {
1459 sScriptMgr->OnFfaPvpStateUpdate(this, true);
1461 for (ControlSet::iterator itr = m_Controlled.begin();
1462 itr != m_Controlled.end(); ++itr)
1463 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1465 }
1466
1468 {
1469 pvpInfo.FFAPvPEndTimer = time_t(0);
1470 }
1471 }
1472 else if (IsFFAPvP())
1473 {
1474 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1476 {
1477 pvpInfo.FFAPvPEndTimer = time_t(0);
1479 {
1481 sScriptMgr->OnFfaPvpStateUpdate(this, false);
1482 }
1483 for (ControlSet::iterator itr = m_Controlled.begin();
1484 itr != m_Controlled.end(); ++itr)
1485 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1487
1488 // xinef: iterate attackers
1489 AttackerSet toRemove;
1490 AttackerSet const& attackers = getAttackers();
1491 for (AttackerSet::const_iterator itr = attackers.begin();
1492 itr != attackers.end(); ++itr)
1493 if (!(*itr)->IsValidAttackTarget(this))
1494 toRemove.insert(*itr);
1495
1496 for (AttackerSet::const_iterator itr = toRemove.begin();
1497 itr != toRemove.end(); ++itr)
1498 (*itr)->AttackStop();
1499
1500 // xinef: remove our own victim
1501 if (Unit* victim = GetVictim())
1502 if (!IsValidAttackTarget(victim))
1503 AttackStop();
1504 }
1505 else
1506 {
1507 // Not in FFA PvP Area
1508 // Not FFA PvP realm
1509 // Not FFA PvP timer already set
1510 // Being recently in PvP combat
1511 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1513 {
1515 GameTime::GetGameTime().count() +
1516 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1517 }
1518 }
1519 }
1520}
@ CONFIG_FFA_PVP_TIMER
Definition IWorld.h:415
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition Player.h:369

References Unit::AttackStop(), CONFIG_FFA_PVP_TIMER, PvPInfo::EndTimer, PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), GameTime::GetGameTime(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), IsGameMaster(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), Object::SetByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by UpdateArea(), and UpdatePvPState().

◆ UpdateFishingSkill()

bool Player::UpdateFishingSkill ( )
884{
885 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
886
888
889 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
890 {
891 return false;
892 }
893
894 /* Whenever the player clicks on the fishing gameobject the
895 * core will decide based on a probability if the skill raises or not.
896 */
897 return UpdateSkillPro(
899 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
900 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
901}
@ CONFIG_SKILL_GAIN_GATHERING
Definition IWorld.h:273
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition PlayerUpdates.cpp:862
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5488

References CONFIG_SKILL_GAIN_GATHERING, GetMaxSkillValue(), getProbabilityOfLevelUp(), GetPureSkillValue(), LOG_DEBUG, SKILL_FISHING, sWorld, and UpdateSkillPro().

Referenced by GameObject::Use().

◆ UpdateForQuestWorldObjects()

void Player::UpdateForQuestWorldObjects ( )

This code doesn't look right, but it was logically converted to condition system to do the exact same thing it did before. It definitely needs to be overlooked for intended functionality.

1785{
1786 if (m_clientGUIDs.empty())
1787 return;
1788
1789 UpdateData udata;
1790 WorldPacket packet;
1791 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
1792 {
1793 if ((*itr).IsGameObject())
1794 {
1795 if (GameObject* obj = ObjectAccessor::GetGameObject(*this, *itr))
1796 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1797 }
1798 else if ((*itr).IsCreatureOrVehicle())
1799 {
1801 if (!obj)
1802 continue;
1803
1804 // check if this unit requires quest specific flags
1806 {
1807 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1808 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1809 {
1812 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1813 bool buildUpdateBlock = false;
1814 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1815 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1816 buildUpdateBlock = true;
1817
1818 if (buildUpdateBlock)
1819 {
1820 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1821 break;
1822 }
1823 }
1824 }
1826 {
1827 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1828 }
1829 }
1830 }
1831
1832 udata.BuildPacket(packet);
1833 GetSession()->SendPacket(&packet);
1834}
@ CONDITION_QUESTREWARDED
Definition ConditionMgr.h:42
@ CONDITION_QUESTTAKEN
Definition ConditionMgr.h:43
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition UnitDefines.h:343
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:257
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:184

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), CONDITION_QUESTREWARDED, CONDITION_QUESTTAKEN, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), ObjectAccessor::GetGameObject(), GetSession(), Unit::HasNpcFlag(), m_clientGUIDs, sConditionMgr, WorldSession::SendPacket(), sObjectMgr, UNIT_NPC_FLAG_SPELLCLICK, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_VENDOR_MASK.

Referenced by Group::AddMember(), Group::Disband(), EquipItem(), ItemAddedQuestCheck(), ItemRemovedQuestCheck(), Group::RemoveMember(), and SendQuestUpdate().

◆ UpdateGatherSkill()

bool Player::UpdateGatherSkill ( uint32  SkillId,
uint32  SkillValue,
uint32  RedLevel,
uint32  Multiplicator = 1 
)
761{
762 LOG_DEBUG("entities.player.skills",
763 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
764 SkillId, SkillValue, RedLevel);
765
766 uint32 gathering_skill_gain =
767 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
768 sScriptMgr->OnUpdateGatheringSkill(this, SkillId, SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25, gathering_skill_gain);
769
770 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
771 // 75-149 - 2 times, 225-299 - 8 times
772 switch (SkillId)
773 {
774 case SKILL_HERBALISM:
778 return UpdateSkillPro(SkillId,
779 SkillGainChance(SkillValue, RedLevel + 100,
780 RedLevel + 50, RedLevel + 25) *
781 Multiplicator,
782 gathering_skill_gain);
783 case SKILL_SKINNING:
784 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
785 return UpdateSkillPro(SkillId,
786 SkillGainChance(SkillValue, RedLevel + 100,
787 RedLevel + 50,
788 RedLevel + 25) *
789 Multiplicator,
790 gathering_skill_gain);
791 else
792 return UpdateSkillPro(
793 SkillId,
794 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
795 RedLevel + 25) *
796 Multiplicator) >>
797 (SkillValue /
799 gathering_skill_gain);
800 case SKILL_MINING:
801 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
802 return UpdateSkillPro(SkillId,
803 SkillGainChance(SkillValue, RedLevel + 100,
804 RedLevel + 50,
805 RedLevel + 25) *
806 Multiplicator,
807 gathering_skill_gain);
808 else
809 return UpdateSkillPro(
810 SkillId,
811 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
812 RedLevel + 25) *
813 Multiplicator) >>
814 (SkillValue /
816 gathering_skill_gain);
817 }
818 return false;
819}
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition IWorld.h:270
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition IWorld.h:269
@ SKILL_INSCRIPTION
Definition SharedDefines.h:3002
@ SKILL_MINING
Definition SharedDefines.h:2919
@ SKILL_SKINNING
Definition SharedDefines.h:2961
@ SKILL_JEWELCRAFTING
Definition SharedDefines.h:2985
@ SKILL_HERBALISM
Definition SharedDefines.h:2915

References CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_GATHERING, LOG_DEBUG, SKILL_HERBALISM, SKILL_INSCRIPTION, SKILL_JEWELCRAFTING, SKILL_LOCKPICKING, SKILL_MINING, SKILL_SKINNING, SkillGainChance(), sScriptMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1390{
1391 // GMs never get homebind timer online
1393 {
1394 if (m_HomebindTimer) // instance valid, but timer not reset
1395 {
1396 // hide reminder
1397 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1398 data << uint32(0);
1399 data << uint32(0);
1400 GetSession()->SendPacket(&data);
1401 }
1402 // instance is valid, reset homebind timer
1403 m_HomebindTimer = 0;
1404 }
1405 else if (m_HomebindTimer > 0)
1406 {
1407 if (time >= m_HomebindTimer)
1408 {
1409 // teleport to nearest graveyard
1411 }
1412 else
1413 m_HomebindTimer -= time;
1414 }
1415 else
1416 {
1417 // instance is invalid, start homebind timer
1418 m_HomebindTimer = 60000;
1419 // send message to player
1420 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1421 data << uint32(m_HomebindTimer);
1422 data << uint32(1);
1423 GetSession()->SendPacket(&data);
1424 LOG_DEBUG(
1425 "maps",
1426 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1427 "seconds",
1428 GetName(), GetGUID().ToString());
1429 }
1430}
@ SMSG_RAID_GROUP_ONLY
Definition Opcodes.h:676

References Object::GetGUID(), WorldObject::GetName(), GetSession(), IsGameMaster(), LOG_DEBUG, m_HomebindTimer, m_InstanceValid, RepopAtGraveyard(), WorldSession::SendPacket(), SMSG_RAID_GROUP_ONLY, and Position::ToString().

Referenced by Update().

◆ UpdateHonorFields()

void Player::UpdateHonorFields ( )

called when rewarding honor and at each save

1178{
1180 time_t now = time_t(GameTime::GetGameTime().count());
1181 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1182
1183 if (m_lastHonorUpdateTime < today)
1184 {
1185 time_t yesterday = today - DAY;
1186
1188
1189 // update yesterday's contribution
1190 if (m_lastHonorUpdateTime >= yesterday)
1191 {
1194
1195 // this is the first update today, reset today's contribution
1198 }
1199 else
1200 {
1201 // no honor/kills yesterday or today, reset
1204 }
1205 }
1206
1208}
uint16 PAIR32_LOPART(uint32 x)
Definition ObjectDefines.h:97

References DAY, GameTime::GetGameTime(), Object::GetUInt32Value(), m_lastHonorUpdateTime, MAKE_PAIR32(), PAIR32_LOPART(), PLAYER_FIELD_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, and Unit::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateInvisibilityDrunkDetect()

void Player::UpdateInvisibilityDrunkDetect ( )
998{
999 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
1000 uint8 drunkValue = GetDrunkValue();
1001 int32 fakeDrunkValue = GetFakeDrunkValue();
1002 int32 maxDrunkValue = std::max<int32>(drunkValue, fakeDrunkValue);
1003
1004 if (maxDrunkValue != 0)
1005 {
1008 }
1009 else
1011
1013}
@ INVISIBILITY_DRUNK
Definition SharedDefines.h:1261
void AddFlag(FLAG_TYPE flag)
Definition Object.h:373
void DelFlag(FLAG_TYPE flag)
Definition Object.h:374
int32 GetFakeDrunkValue() const
Definition Player.h:2180
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition Object.h:526

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkValue(), GetFakeDrunkValue(), INVISIBILITY_DRUNK, WorldObject::m_invisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by AuraEffect::HandleAuraModFakeInebriation(), and SetDrunkValue().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4146{
4147 if (m_itemDuration.empty())
4148 return;
4149
4150 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4151
4152 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4153 {
4154 Item* item = *itr;
4155 ++itr; // current element can be erased in UpdateDuration
4156
4157 if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME))
4158 item->UpdateDuration(this, time);
4159 }
4160}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition ItemTemplate.h:219
void UpdateDuration(Player *owner, uint32 diff)
Definition Item.cpp:318
bool HasFlagCu(ItemFlagsCustom flag) const
Definition ItemTemplate.h:829

References Item::GetTemplate(), ItemTemplate::HasFlagCu(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateLFGChannel()

void Player::UpdateLFGChannel ( )
465{
466 if (!sWorld->getBoolConfig(CONFIG_RESTRICTED_LFG_CHANNEL))
467 return;
468
470 if (!cMgr)
471 return;
472
473 ChatChannelsEntry const* cce = sChatChannelsStore.LookupEntry(26); /*LookingForGroup*/
475 if (!cLFG)
476 return;
477
478 Channel* cUsed = nullptr;
479 for (Channel* channel : m_channels)
480 if (channel && channel->GetChannelId() == cce->ChannelID)
481 {
482 cUsed = cLFG;
483 break;
484 }
485
486 if (IsUsingLfg())
487 {
488 if (cUsed == cLFG)
489 return;
490
491 cLFG->JoinChannel(this, "");
492 }
493 else
494 {
495 if (cLFG != cUsed)
496 return;
497
498 cLFG->LeaveChannel(this, true);
499 }
500}
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ CONFIG_RESTRICTED_LFG_CHANNEL
Definition IWorld.h:98
Definition ChannelMgr.h:29
static ChannelMgr * forTeam(TeamId teamId)
Definition ChannelMgr.cpp:33
Channel * GetJoinChannel(std::string const &name, uint32 channel_id)
Definition ChannelMgr.cpp:121
void JoinChannel(Player *player, std::string const &pass)
Definition Channel.cpp:157
bool IsUsingLfg()
Definition Player.cpp:13108
LocaleConstant GetSessionDbcLocale() const
Definition WorldSession.h:511
Definition DBCStructure.h:642
uint32 ChannelID
Definition DBCStructure.h:643
char const * pattern[16]
Definition DBCStructure.h:645

References ChatChannelsEntry::ChannelID, CONFIG_RESTRICTED_LFG_CHANNEL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsUsingLfg(), Channel::JoinChannel(), Channel::LeaveChannel(), m_channels, m_session, ChatChannelsEntry::pattern, sChatChannelsStore, and sWorld.

Referenced by WorldSession::HandleLfgJoinOpcode(), and WorldSession::HandleLfgLeaveOpcode().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
503{
504 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
505 static std::mutex channelsLock;
506 std::lock_guard<std::mutex> guard(channelsLock);
507
508 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
509 return; // The client handles it automatically after loading, but not
510 // after teleporting
511
512 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
513 if (!current_zone)
514 return;
515
517 if (!cMgr)
518 return;
519
520 std::string current_zone_name =
521 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
522
523 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
524 {
525 if (ChatChannelsEntry const* channel =
526 sChatChannelsStore.LookupEntry(i))
527 {
528 Channel* usedChannel = nullptr;
529
530 for (Channel* channel : m_channels)
531 {
532 if (channel && channel->GetChannelId() == i)
533 {
534 usedChannel = channel;
535 break;
536 }
537 }
538
539 Channel* removeChannel = nullptr;
540 Channel* joinChannel = nullptr;
541 bool sendRemove = true;
542
543 if (CanJoinConstantChannelInZone(channel, current_zone))
544 {
545 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
546 {
547 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
548 usedChannel)
549 continue; // Already on the channel, as city channel
550 // names are not changing
551
552 char new_channel_name_buf[100];
553 char const* currentNameExt;
554
555 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
556 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(
557 LANG_CHANNEL_CITY).c_str();
558 else
559 currentNameExt = current_zone_name.c_str();
560
561 snprintf(new_channel_name_buf, 100,
562 channel->pattern[m_session->GetSessionDbcLocale()],
563 currentNameExt);
564
565 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
566 channel->ChannelID);
567 if (usedChannel)
568 {
569 if (joinChannel != usedChannel)
570 {
571 removeChannel = usedChannel;
572 sendRemove = false; // Do not send leave channel, it
573 // already replaced at client
574 }
575 else
576 joinChannel = nullptr;
577 }
578 }
579 else
580 joinChannel = cMgr->GetJoinChannel(
581 channel->pattern[m_session->GetSessionDbcLocale()],
582 channel->ChannelID);
583 }
584 else
585 removeChannel = usedChannel;
586
587 if (joinChannel)
588 joinChannel->JoinChannel(
589 this, ""); // Changed Channel: ... or Joined Channel: ...
590
591 if (removeChannel)
592 {
593 removeChannel->LeaveChannel(this,
594 sendRemove); // Leave old channel
595 std::string name =
596 removeChannel
597 ->GetName(); // Store name, (*i)erase in LeftChannel
598 LeftChannel(removeChannel); // Remove from player's channel list
599 }
600 }
601 }
602}
@ CHANNEL_DBC_FLAG_GLOBAL
Definition Channel.h:95
@ LANG_CHANNEL_CITY
Definition Language.h:759
std::string const & GetName() const
Definition Channel.h:179
void LeftChannel(Channel *c)
Definition Player.cpp:5018
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition Player.cpp:4995
char const * area_name[16]
Definition DBCStructure.h:526

References AreaTableEntry::area_name, CanJoinConstantChannelInZone(), CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GLOBAL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), Channel::GetName(), GetSession(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsBeingTeleportedFar(), Channel::JoinChannel(), LANG_CHANNEL_CITY, Channel::LeaveChannel(), LeftChannel(), m_channels, m_session, sAreaTableStore, sChatChannelsStore, and sObjectMgr.

Referenced by UpdateZone().

◆ UpdateLootAchievements()

void Player::UpdateLootAchievements ( LootItem item,
Loot loot 
)

◆ UpdateManaRegen()

void Player::UpdateManaRegen ( )
925{
927 {
930 return;
931 }
932
933 float Intellect = GetStat(STAT_INTELLECT);
934 // Mana regen from spirit and intellect
935 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
936 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
938
939 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
941
942 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
944 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
945 {
946 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
947 }
948
949 // Set regen rate in cast state apply only on spirit based regen
951 if (modManaRegenInterrupt > 100)
952 modManaRegenInterrupt = 100;
953 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
954
955 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
956}
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
Definition SpellAuraDefines.h:197
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
Definition SpellAuraDefines.h:282
float OCTRegenMPPerSpirit()
Definition Player.cpp:5261
float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6082

References CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetStat(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), Unit::GetTotalAuraMultiplierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), m_baseManaRegen, OCTRegenMPPerSpirit(), POWER_MANA, Object::SetStatFloatValue(), SPELL_AURA_MOD_MANA_REGEN_FROM_STAT, SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, STAT_INTELLECT, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by ApplyManaRegenBonus(), AuraEffect::HandleModManaRegen(), AuraEffect::HandleModPowerRegen(), UpdateAllStats(), and UpdateStats().

◆ UpdateMaxHealth()

void Player::UpdateMaxHealth ( )
overridevirtual

Implements Unit.

297{
298 UnitMods unitMod = UNIT_MOD_HEALTH;
299
300 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
301 value *= GetModifierValue(unitMod, BASE_PCT);
303 value *= GetModifierValue(unitMod, TOTAL_PCT);
304
305 sScriptMgr->OnAfterUpdateMaxHealth(this, value);
306 SetMaxHealth((uint32)value);
307}
float GetHealthBonusFromStamina()
Definition StatSystem.cpp:276

References BASE_PCT, BASE_VALUE, Unit::GetCreateHealth(), GetHealthBonusFromStamina(), Unit::GetModifierValue(), Unit::SetMaxHealth(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_HEALTH.

Referenced by UpdateAllStats(), and UpdateStats().

◆ UpdateMaxPower()

void Player::UpdateMaxPower ( Powers  power)
overridevirtual

Implements Unit.

310{
311 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);
312
313 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaBonusFromIntellect() : 0;
314
315 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
316 value *= GetModifierValue(unitMod, BASE_PCT);
317 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonusPower;
318 value *= GetModifierValue(unitMod, TOTAL_PCT);
319
320 sScriptMgr->OnAfterUpdateMaxPower(this, power, value);
321 SetMaxPower(power, uint32(value));
322}
@ UNIT_MOD_POWER_START
Definition Unit.h:174
float GetManaBonusFromIntellect()
Definition StatSystem.cpp:286

References BASE_PCT, BASE_VALUE, Unit::GetCreatePowers(), GetManaBonusFromIntellect(), Unit::GetModifierValue(), POWER_MANA, Unit::SetMaxPower(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_POWER_START.

Referenced by Create(), UpdateAllStats(), and UpdateStats().

◆ UpdateMeleeHitChances()

void Player::UpdateMeleeHitChances ( )

◆ UpdateMirrorTimers()

void Player::UpdateMirrorTimers ( )
430{
431 // Desync flags for update on next HandleDrowning
433 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
434}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
437{
438 // Update the next delivery time and unread mails
439 time_t cTime = GameTime::GetGameTime().count();
440
442 unReadMails = 0;
443
444 for (Mail const* mail : GetMails())
445 {
446 if (mail->deliver_time > cTime)
447 {
448 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time)
449 m_nextMailDelivereTime = mail->deliver_time;
450 }
451
452 // must be not checked yet
453 if (mail->checked & MAIL_CHECK_MASK_READ)
454 continue;
455
456 // and already delivered or expired
457 if (cTime < mail->deliver_time || cTime > mail->expire_time)
458 continue;
459
460 unReadMails++;
461 }
462}
@ MAIL_CHECK_MASK_READ
Definition Mail.h:47
PlayerMails const & GetMails() const
Definition Player.h:1660

References GameTime::GetGameTime(), GetMails(), m_nextMailDelivereTime, MAIL_CHECK_MASK_READ, and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1610{
1611 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1612 if (!IsInWorld())
1613 return;
1614
1615 if (!forced)
1617 else if (!isBeingLoaded())
1618 {
1619 if (!fromUpdate) // pussywizard:
1620 {
1622 return;
1623 }
1626 }
1627}
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19196
void AddToNotify(uint16 f)
Definition Object.cpp:2991

References WorldObject::AddToNotify(), Unit::bRequestForcedVisibilityUpdate, isBeingLoaded(), Object::IsInWorld(), NOTIFY_VISIBILITY_CHANGED, Unit::UpdateObjectVisibility(), and UpdateVisibilityForPlayer().

Referenced by Map::AddPlayerToMap(), gm_commandscript::HandleGMVisibleCommand(), WorldSession::HandlePlayerLoginToCharInWorld(), Map::PlayerRelocation(), ResurrectPlayer(), SetGameMaster(), SetGroup(), Update(), and UpdateInvisibilityDrunkDetect().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
736{
737 const float parry_cap[MAX_CLASSES] =
738 {
739 47.003525f, // Warrior
740 47.003525f, // Paladin
741 145.560408f, // Hunter
742 145.560408f, // Rogue
743 0.0f, // Priest
744 47.003525f, // DK
745 145.560408f, // Shaman
746 0.0f, // Mage
747 0.0f, // Warlock
748 0.0f, // ??
749 0.0f // Druid
750 };
751
752 // No parry
753 float value = 0.0f;
754 m_realParry = 0.0f;
755 uint32 pclass = getClass() - 1;
756 if (CanParry() && parry_cap[pclass] > 0.0f)
757 {
758 float nondiminishing = 5.0f;
759 // Parry from rating
760 float diminishing = GetRatingBonusValue(CR_PARRY);
761 // Modify value from defense skill (only bonus from defense rating diminishes)
762 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
763 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
764 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
766 // apply diminishing formula to diminishing parry chance
767 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
768 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
769
770 value = std::max(diminishing + nondiminishing, 0.0f);
771
772 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
773 {
774 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
775 }
776 }
777
779}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110
bool CanParry() const
Definition Player.h:2191

References CanParry(), CR_DEFENSE_SKILL, CR_PARRY, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realParry, MAX_CLASSES, PLAYER_PARRY_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_PARRY_PERCENT.

Referenced by AuraEffect::HandleAuraModParryPercent(), SetCanParry(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdatePlayerSetting()

void Player::UpdatePlayerSetting ( std::string  source,
uint8  index,
uint32  value 
)
116{
117 auto itr = m_charSettingsMap.find(source);
118 uint8 size = index + 1;
119
120 if (itr == m_charSettingsMap.end())
121 {
122 // Settings not found, initialize a new entry.
123 PlayerSettingVector setting;
124 setting.resize(size);
125
126 for (uint32 itr = 0; itr <= index; ++itr)
127 {
128 PlayerSetting set;
129 set.value = itr == index ? value : 0;
130
131 setting[itr] = set;
132 }
133
134 m_charSettingsMap[source] = setting;
135 }
136 else
137 {
138 if (size > itr->second.size())
139 {
140 itr->second.resize(size);
141 }
142 itr->second[index].value = value;
143 }
144}

References m_charSettingsMap, and PlayerSetting::value.

Referenced by GetPlayerSetting(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ UpdatePosition() [1/2]

bool Player::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline
2029{ return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
Definition PlayerUpdates.cpp:1151

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and UpdatePosition().

Referenced by UpdatePosition().

◆ UpdatePosition() [2/2]

bool Player::UpdatePosition ( float  x,
float  y,
float  z,
float  orientation,
bool  teleport = false 
)
overridevirtual

Reimplemented from Unit.

1153{
1154 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1155 return false;
1156
1157 // Update player zone if needed
1158 if (m_needZoneUpdate)
1159 {
1160 uint32 newZone, newArea;
1161 GetZoneAndAreaId(newZone, newArea);
1162 UpdateZone(newZone, newArea);
1163 m_needZoneUpdate = false;
1164 }
1165
1166 if (GetGroup())
1168
1171
1173
1174 return true;
1175}
@ GROUP_UPDATE_FLAG_POSITION
Definition Group.h:108
void CheckAreaExploreAndOutdoor()
Definition Player.cpp:5749
Player * GetTrader() const
Definition Player.h:1386
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:20091

References CheckAreaExploreAndOutdoor(), GetGroup(), GetSession(), GetTrader(), WorldObject::GetZoneAndAreaId(), GROUP_UPDATE_FLAG_POSITION, INTERACTION_DISTANCE, WorldObject::IsWithinDistInMap(), m_needZoneUpdate, WorldSession::SendCancelTrade(), SetGroupUpdateFlag(), Unit::UpdatePosition(), and UpdateZone().

Referenced by spell_rog_killing_spree_aura::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1540{
1541 // no potion used i combat or still in combat
1542 if (!GetLastPotionId() || IsInCombat())
1543 return;
1544
1545 // Call not from spell cast, send cooldown event for item spells if no in
1546 // combat
1547 if (!spell)
1548 {
1549 // spell/item pair let set proper cooldown (except not existed charged
1550 // spell cooldown spellmods for potions)
1551 if (ItemTemplate const* proto =
1552 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1553 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1554 if (proto->Spells[idx].SpellId &&
1555 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1556 if (SpellInfo const* spellInfo =
1557 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1558 SendCooldownEvent(spellInfo, GetLastPotionId());
1559 }
1560 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1561 else
1562 {
1563 if (spell->IsIgnoringCooldowns())
1564 return;
1565
1567 }
1568
1569 SetLastPotionId(0);
1570}
void SetLastPotionId(uint32 item_id)
Definition Player.h:1820
uint32 GetLastPotionId()
Definition Player.h:1819
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11145
bool IsIgnoringCooldowns() const
Definition Spell.cpp:8081

References GetLastPotionId(), Spell::IsIgnoringCooldowns(), Unit::IsInCombat(), ITEM_SPELLTRIGGER_ON_USE, m_lastPotionId, Spell::m_spellInfo, MAX_ITEM_SPELLS, SendCooldownEvent(), SetLastPotionId(), sObjectMgr, and sSpellMgr.

Referenced by Spell::finish().

◆ UpdatePvP()

void Player::UpdatePvP ( bool  state,
bool  _override = false 
)

◆ UpdatePvPFlag()

void Player::UpdatePvPFlag ( time_t  currTime)
373{
374 if (!IsPvP())
375 return;
376
377 if (pvpInfo.EndTimer == 0 || pvpInfo.IsHostile)
378 return;
379
380 if (currTime < (pvpInfo.EndTimer + 300 + 5))
381 {
382 if (currTime > (pvpInfo.EndTimer + 4) && !HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER))
384
385 return;
386 }
387
388 UpdatePvP(false);
389}
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1522

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1433{
1435
1436 if (pvpInfo.IsHostile) // in hostile area
1437 {
1438 if (!IsPvP() || pvpInfo.EndTimer != 0)
1439 UpdatePvP(true, true);
1440 }
1441 else // in friendly area
1442 {
1444 pvpInfo.EndTimer == 0)
1445 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1446 }
1447}
@ PLAYER_FLAGS_IN_PVP
Definition Player.h:488

References PvPInfo::EndTimer, GameTime::GetGameTime(), HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_IN_PVP, pvpInfo, UpdateFFAPvPState(), and UpdatePvP().

Referenced by AddQuest(), Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), Unit::SetCharm(), and UpdateZone().

◆ UpdateRangedHitChances()

◆ UpdateRating()

void Player::UpdateRating ( CombatRating  cr)
612{
613 int32 amount = m_baseRatingValue[cr];
614 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
615 // stat used stored in miscValueB for this aura
616 AuraEffectList const& modRatingFromStat =
618 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
619 i != modRatingFromStat.end(); ++i)
620 if ((*i)->GetMiscValue() & (1 << cr))
621 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
622 (*i)->GetAmount()));
623 if (amount < 0)
624 amount = 0;
625 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
626
627 bool affectStats = CanModifyStats();
628
629 switch (cr)
630 {
631 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
632 case CR_DEFENSE_SKILL:
634 break;
635 case CR_DODGE:
637 break;
638 case CR_PARRY:
640 break;
641 case CR_BLOCK:
643 break;
644 case CR_HIT_MELEE:
646 break;
647 case CR_HIT_RANGED:
649 break;
650 case CR_HIT_SPELL:
652 break;
653 case CR_CRIT_MELEE:
654 if (affectStats)
655 {
658 }
659 break;
660 case CR_CRIT_RANGED:
661 if (affectStats)
663 break;
664 case CR_CRIT_SPELL:
665 if (affectStats)
667 break;
668 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
670 break;
671 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
672 break;
673 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
674 // (only for chance to crit)
676 break;
677 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
678 // for chance to crit)
679 break;
680 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
681 case CR_HASTE_RANGED:
682 case CR_HASTE_SPELL:
683 break;
684 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
685 // Unit::RollMeleeOutcomeAgainst
688 break;
689 case CR_EXPERTISE:
690 if (affectStats)
691 {
694 }
695 break;
697 if (affectStats)
699 break;
700 }
701}
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition SpellAuraDefines.h:283
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:239
@ CR_WEAPON_SKILL
Definition Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:237
void UpdateArmorPenetration(int32 amount)
Definition StatSystem.cpp:847
void UpdateSpellHitChances()
Definition StatSystem.cpp:865
void UpdateMeleeHitChances()
Definition StatSystem.cpp:853
void UpdateRangedHitChances()
Definition StatSystem.cpp:859

References BASE_ATTACK, CalculatePct(), Unit::CanModifyStats(), CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, Unit::GetAuraEffectsByType(), Unit::GetStat(), m_baseRatingValue, OFF_ATTACK, PLAYER_FIELD_COMBAT_RATING_1, RANGED_ATTACK, Unit::SetUInt32Value(), SPELL_AURA_MOD_RATING_FROM_STAT, UpdateAllSpellCritChances(), UpdateArmorPenetration(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDefenseBonusesMod(), UpdateDodgePercentage(), UpdateExpertise(), UpdateMeleeHitChances(), UpdateParryPercentage(), UpdateRangedHitChances(), and UpdateSpellHitChances().

Referenced by ApplyRatingMod(), and UpdateAllRatings().

◆ UpdateResistances()

void Player::UpdateResistances ( uint32  school)
overridevirtual

Implements Unit.

226{
227 if (school > SPELL_SCHOOL_NORMAL)
228 {
229 // cant use GetTotalAuraModValue because of total pct multiplier :P
230 float value = 0.0f;
231 UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school);
232
233 value = GetModifierValue(unitMod, BASE_VALUE);
234 value *= GetModifierValue(unitMod, BASE_PCT);
235 value += GetModifierValue(unitMod, TOTAL_VALUE);
236
238 for(AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
239 {
240 if ((*i)->GetMiscValue() & (1 << (school - 1)))
241 value += int32(GetStat(Stats((*i)->GetMiscValueB())) * (*i)->GetAmount() / 100.0f);
242 }
243
244 value *= GetModifierValue(unitMod, TOTAL_PCT);
245
246 SetResistance(SpellSchools(school), int32(value));
247 }
248 else
249 UpdateArmor();
250}

References BASE_PCT, BASE_VALUE, Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetResistance(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_RESISTANCE_START, and UpdateArmor().

◆ UpdateRuneRegen()

void Player::UpdateRuneRegen ( RuneType  rune)
959{
960 if (rune >= NUM_RUNE_TYPES)
961 return;
962
963 uint32 cooldown = 0;
964
965 for (uint32 i = 0; i < MAX_RUNES; ++i)
966 if (GetBaseRune(i) == rune)
967 {
968 cooldown = GetRuneBaseCooldown(i, true);
969 break;
970 }
971
972 if (cooldown <= 0)
973 return;
974
975 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
977}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition Player.cpp:13409

References GetBaseRune(), GetRuneBaseCooldown(), IN_MILLISECONDS, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, and Object::SetFloatValue().

Referenced by AuraEffect::HandleModPowerRegen().

◆ UpdateShieldBlockValue()

void Player::UpdateShieldBlockValue ( )
523{
525}
uint32 GetShieldBlockValue() const override
Definition Player.cpp:5107

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Unit::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
711{
712 if (!skill_id)
713 return false;
714
715 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
716 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
717 return false;
718
719 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
720 uint32 data = GetUInt32Value(valueIndex);
721 uint32 value = SKILL_VALUE(data);
722 uint32 max = SKILL_MAX(data);
723
724 if ((!max) || (!value) || (value >= max))
725 return false;
726
727 if (value < max)
728 {
729 uint32 new_value = value + step;
730 if (new_value > max)
731 new_value = max;
732
733 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
734 if (itr->second.uState != SKILL_NEW)
735 itr->second.uState = SKILL_CHANGED;
736
737 UpdateSkillEnchantments(skill_id, value, new_value);
739 skill_id);
740 return true;
741 }
742
743 return false;
744}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateDefense(), and UpdateWeaponSkill().

◆ UpdateSkillEnchantments()

void Player::UpdateSkillEnchantments ( uint16  skill_id,
uint16  curr_value,
uint16  new_value 
)
4682{
4683 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4684 {
4685 if (m_items[i])
4686 {
4687 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4688 {
4689 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4690 if (!ench_id)
4691 continue;
4692
4693 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4694 if (!Enchant)
4695 return;
4696
4697 if (Enchant->requiredSkill == skill_id)
4698 {
4699 // Checks if the enchantment needs to be applied or removed
4700 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4701 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4702 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4703 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4704 }
4705
4706 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4707 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4709 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4710 {
4711 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4712
4713 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4714 {
4715 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4716 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4717 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4718 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4719 }
4720 }
4721 }
4722 }
4723 }
4724}
Definition Socket.h:52

References ApplyEnchantment(), Item::GetEnchantmentId(), INVENTORY_SLOT_BAG_END, m_items, MAX_ENCHANTMENT_SLOT, PRISMATIC_ENCHANTMENT_SLOT, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, and sSpellItemEnchantmentStore.

Referenced by SetSkill(), UpdateSkill(), and UpdateSkillPro().

◆ UpdateSkillPro()

bool Player::UpdateSkillPro ( uint16  SkillId,
int32  Chance,
uint32  step 
)
911{
912 LOG_DEBUG("entities.player.skills",
913 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
914 Chance / 10.0f);
915 if (!SkillId)
916 return false;
917
918 if (Chance <= 0) // speedup in 0 chance case
919 {
920 LOG_DEBUG("entities.player.skills",
921 "Player::UpdateSkillPro Chance={:3.1f}% missed",
922 Chance / 10.0f);
923 return false;
924 }
925
926 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
927 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
928 return false;
929
930 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
931
932 uint32 data = GetUInt32Value(valueIndex);
933 uint16 SkillValue = SKILL_VALUE(data);
934 uint16 MaxValue = SKILL_MAX(data);
935
936 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
937 return false;
938
939 int32 Roll = irand(1, 1000);
940
941 if (Roll <= Chance)
942 {
943 uint32 new_value = SkillValue + step;
944 if (new_value > MaxValue)
945 new_value = MaxValue;
946
947 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
948 if (itr->second.uState != SKILL_NEW)
949 itr->second.uState = SKILL_CHANGED;
950
951 for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i)
952 {
953 uint32 bsl = bonusSkillLevels[i];
954 if (SkillValue < bsl && new_value >= bsl)
955 {
956 learnSkillRewardedSpells(SkillId, new_value);
957 break;
958 }
959 }
960 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
962 SkillId);
963 LOG_DEBUG("entities.player.skills",
964 "Player::UpdateSkillPro Chance={:3.1f}% taken",
965 Chance / 10.0f);
966 return true;
967 }
968
969 LOG_DEBUG("entities.player.skills",
970 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
971 return false;
972}
static uint32 bonusSkillLevels[]
Definition PlayerUpdates.cpp:906
static const std::size_t bonusSkillLevelsSize
Definition PlayerUpdates.cpp:907
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
Definition Group.h:143

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateCraftSkill(), UpdateFishingSkill(), and UpdateGatherSkill().

◆ UpdateSkillsForLevel()

void Player::UpdateSkillsForLevel ( )

update only level dependent max skill values

maximize skill always

update max skill value if current max skill not maximized

1075{
1076 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1077 uint32 maxSkill = GetMaxSkillValueForLevel();
1078
1079 bool alwaysMaxSkill =
1081
1082 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1083 itr != mSkillStatus.end(); ++itr)
1084 {
1085 if (itr->second.uState == SKILL_DELETED)
1086 continue;
1087
1088 uint32 pskill = itr->first;
1089 SkillRaceClassInfoEntry const* rcEntry =
1091 if (!rcEntry)
1092 continue;
1093
1094 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1095 continue;
1096
1097 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1098 uint32 data = GetUInt32Value(valueIndex);
1099 uint32 max = SKILL_MAX(data);
1100 uint32 val = SKILL_VALUE(data);
1101
1103 if (max != 1)
1104 {
1106 if (alwaysMaxSkill ||
1108 {
1109 SetUInt32Value(valueIndex,
1110 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1111 if (itr->second.uState != SKILL_NEW)
1112 itr->second.uState = SKILL_CHANGED;
1113 }
1114 else if (max != maxconfskill)
1116 {
1117 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1118 if (itr->second.uState != SKILL_NEW)
1119 itr->second.uState = SKILL_CHANGED;
1120 }
1121 }
1122 }
1123}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition IWorld.h:95

References CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_MAX, SKILL_NEW, SKILL_RANGE_LEVEL, SKILL_VALUE, and sWorld.

Referenced by GiveLevel(), InitStatsForLevel(), and LoadFromDB().

◆ UpdateSkillsToMaxSkillsForLevel()

void Player::UpdateSkillsToMaxSkillsForLevel ( )
1126{
1127 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1128 itr != mSkillStatus.end(); ++itr)
1129 {
1130 if (itr->second.uState == SKILL_DELETED)
1131 continue;
1132
1133 uint32 pskill = itr->first;
1134 if (IsProfessionOrRidingSkill(pskill))
1135 continue;
1136 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1137 uint32 data = GetUInt32Value(valueIndex);
1138 uint32 max = SKILL_MAX(data);
1139
1140 if (max > 1)
1141 {
1142 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1143 if (itr->second.uState != SKILL_NEW)
1144 itr->second.uState = SKILL_CHANGED;
1145 }
1146 if (pskill == SKILL_DEFENSE)
1148 }
1149}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4109{
4110 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4111 if (m_itemSoulboundTradeable.empty())
4112 return;
4113
4114 // also checks for garbage data
4115 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4116 {
4117 ASSERT(*itr);
4118 if ((*itr)->GetOwnerGUID() != GetGUID())
4119 {
4120 m_itemSoulboundTradeable.erase(itr++);
4121 continue;
4122 }
4123 if ((*itr)->CheckSoulboundTradeExpire())
4124 {
4125 m_itemSoulboundTradeable.erase(itr++);
4126 continue;
4127 }
4128 ++itr;
4129 }
4130}

References ASSERT, Object::GetGUID(), m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by Update().

◆ UpdateSpeakTime()

void Player::UpdateSpeakTime ( ChatFloodThrottle::Index  index)
30{
31 // ignore chat spam protection for GMs in any mode
33 return;
34
35 uint32 limit, delay;
36 switch (index)
37 {
39 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT);
40 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY);
41 break;
43 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT);
44 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
45 [[fallthrough]];
46 default:
47 return;
48 }
49 time_t current = GameTime::GetGameTime().count();
50 if (m_chatFloodData[index].Time > current)
51 {
52 ++m_chatFloodData[index].Count;
53 if (m_chatFloodData[index].Count >= limit)
54 {
55 // prevent overwrite mute time, if message send just before mutes set, for example.
56 time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME);
57 if (GetSession()->m_muteTime < new_mute)
58 GetSession()->m_muteTime = new_mute;
59
60 m_chatFloodData[index].Count = 0;
61 }
62 }
63 else
64 m_chatFloodData[index].Count = 1;
65
66 m_chatFloodData[index].Time = current + delay;
67}
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition IWorld.h:281
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition IWorld.h:279
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition IWorld.h:278
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition IWorld.h:277
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition IWorld.h:280
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition Player.h:2791
@ ADDON
Definition Player.h:2326
@ REGULAR
Definition Player.h:2325

References Player::ChatFloodThrottle::ADDON, CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, GameTime::GetGameTime(), GetSession(), AccountMgr::IsPlayerAccount(), m_chatFloodData, WorldSession::m_muteTime, Player::ChatFloodThrottle::REGULAR, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode(), and WorldSession::HandleTextEmoteOpcode().

◆ UpdateSpecCount()

void Player::UpdateSpecCount ( uint8  count)
2187{
2188 uint32 curCount = GetSpecsCount();
2189 if (curCount == count)
2190 return;
2191
2192 if (m_activeSpec >= count)
2193 ActivateSpec(0);
2194
2195 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2196 CharacterDatabasePreparedStatement* stmt = nullptr;
2197
2198 // Copy spec data
2199 if (count > curCount)
2200 {
2201 _SaveActions(trans); // make sure the button list is cleaned up
2202 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2203 itr != m_actionButtons.end(); ++itr)
2204 {
2205 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2206 stmt->SetData(0, GetGUID().GetCounter());
2207 stmt->SetData(1, 1);
2208 stmt->SetData(2, itr->first);
2209 stmt->SetData(3, itr->second.GetAction());
2210 stmt->SetData(4, uint8(itr->second.GetType()));
2211 trans->Append(stmt);
2212 }
2213 }
2214 // Delete spec data for removed spec.
2215 else if (count < curCount)
2216 {
2217 _SaveActions(trans);
2218
2219 stmt = CharacterDatabase.GetPreparedStatement(
2221 stmt->SetData(0, m_activeSpec);
2222 stmt->SetData(1, GetGUID().GetCounter());
2223 trans->Append(stmt);
2224
2225 m_activeSpec = 0;
2226 }
2227
2228 CharacterDatabase.CommitTransaction(trans);
2229
2230 SetSpecsCount(count);
2231
2232 SendTalentsInfoData(false);
2233}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition CharacterDatabase.h:457
void ActivateSpec(uint8 spec)
Definition Player.cpp:15106
void SetSpecsCount(uint8 count)
Definition Player.h:1752

References _SaveActions(), ActivateSpec(), CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, CHAR_INS_CHAR_ACTION, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), GetSpecsCount(), m_actionButtons, m_activeSpec, SendTalentsInfoData(), PreparedStatementBase::SetData(), and SetSpecsCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
823{
824 // For normal school set zero crit chance
825 if (school == SPELL_SCHOOL_NORMAL)
826 {
828 return;
829 }
830 // For others recalculate it from:
831 float crit = 0.0f;
832 // Crit from Intellect
834 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
836 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
838 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
840 // Increase crit from spell crit ratings
842
843 // Store crit value
845}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
float GetSpellCritFromIntellect()
Definition Player.cpp:5186
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6017
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition Unit.cpp:5946

References CR_CRIT_SPELL, GetRatingBonusValue(), GetSpellCritFromIntellect(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierAreaExclusive(), Unit::GetTotalAuraModifierByMiscMask(), PLAYER_SPELL_CRIT_PERCENTAGE1, Object::SetFloatValue(), SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by AuraEffect::HandleModSpellCritChanceShool(), and UpdateAllSpellCritChances().

◆ UpdateSpellDamageAndHealingBonus()

void Player::UpdateSpellDamageAndHealingBonus ( )
178{
179 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
180 // This information for client side use only
181 // Get healing bonus for all schools
183 // Get damage bonus for all schools
184 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
186}
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:798
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12761
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:11996

References MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, Object::SetStatInt32Value(), SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), and Unit::SpellBaseHealingBonusDone().

Referenced by AuraEffect::HandleModHealingDone(), AuraEffect::HandleModSpellDamagePercentFromAttackPower(), AuraEffect::HandleModSpellDamagePercentFromStat(), AuraEffect::HandleModSpellHealingPercentFromAttackPower(), AuraEffect::HandleModSpellHealingPercentFromStat(), UpdateAllStats(), UpdateAttackPowerAndDamage(), and UpdateStats().

◆ UpdateSpellHitChances()

void Player::UpdateSpellHitChances ( )

◆ UpdateStats()

bool Player::UpdateStats ( Stats  stat)
overridevirtual

Implements Unit.

98{
99 if (stat > STAT_SPIRIT)
100 return false;
101
102 // value = ((base_value * base_pct) + total_value) * total_pct
103 float value = GetTotalStatValue(stat);
104
105 SetStat(stat, int32(value));
106
107 switch (stat)
108 {
109 case STAT_STRENGTH:
111 break;
112 case STAT_AGILITY:
113 UpdateArmor();
116 break;
117 case STAT_STAMINA:
119 break;
120 case STAT_INTELLECT:
123 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
124 break;
125 default:
126 break;
127 }
128
129 if (stat == STAT_STRENGTH)
130 {
134 }
135 else if (stat == STAT_AGILITY)
136 {
139 }
140 else
141 {
142 // Need update (exist AP from stat auras)
147 }
148
151
152 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
153 uint32 mask = 0;
155 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
156 if (Stats((*i)->GetMiscValueB()) == stat)
157 mask |= (*i)->GetMiscValue();
158 if (mask)
159 {
160 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
161 if (mask & (1 << rating))
162 ApplyRatingMod(CombatRating(rating), 0, true);
163 }
164 return true;
165}

References ApplyRatingMod(), Unit::GetAuraEffectsByType(), Unit::GetTotalStatValue(), Unit::HasAuraTypeWithMiscvalue(), MAX_COMBAT_RATING, POWER_MANA, Unit::SetStat(), SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RATING_FROM_STAT, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDodgePercentage(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

◆ UpdateTitansGrip()

void Player::UpdateTitansGrip ( )

◆ UpdateTriggerVisibility()

void Player::UpdateTriggerVisibility ( )
1739{
1740 if (m_clientGUIDs.empty())
1741 return;
1742
1743 if (!IsInWorld())
1744 return;
1745
1746 UpdateData udata;
1747 WorldPacket packet;
1748 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin();
1749 itr != m_clientGUIDs.end(); ++itr)
1750 {
1751 if ((*itr).IsCreatureOrVehicle())
1752 {
1753 Creature* creature = GetMap()->GetCreature(*itr);
1754 // Update fields of triggers, transformed units or unselectable
1755 // units (values dependent on GM state)
1756 if (!creature || (!creature->IsTrigger() &&
1757 !creature->HasTransformAura() &&
1759 continue;
1760
1762 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1764 }
1765 else if ((*itr).IsGameObject())
1766 {
1767 GameObject* go = GetMap()->GetGameObject(*itr);
1768 if (!go)
1769 continue;
1770
1772 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1774 }
1775 }
1776
1777 if (!udata.HasData())
1778 return;
1779
1780 udata.BuildPacket(packet);
1781 GetSession()->SendPacket(&packet);
1782}
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
bool IsTrigger() const
Definition Creature.h:75
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:195
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:194
bool HasTransformAura() const
Definition Unit.h:1722
bool HasData() const
Definition UpdateData.h:60

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), Map::GetCreature(), Map::GetGameObject(), WorldObject::GetMap(), GetSession(), UpdateData::HasData(), Unit::HasTransformAura(), Unit::HasUnitFlag(), Object::IsInWorld(), Creature::IsTrigger(), m_clientGUIDs, Object::RemoveFieldNotifyFlag(), WorldSession::SendPacket(), Object::SetFieldNotifyFlag(), UF_FLAG_PUBLIC, and UNIT_FLAG_NOT_SELECTABLE.

Referenced by gm_commandscript::HandleGMOffCommand(), and gm_commandscript::HandleGMOnCommand().

◆ UpdateVisibilityForPlayer()

void Player::UpdateVisibilityForPlayer ( bool  mapChange = false)
1585{
1586 // After added to map seer must be a player - there is no possibility to
1587 // still have different seer (all charm auras must be already removed)
1588 if (mapChange && m_seer != this)
1589 {
1590 m_seer = this;
1591 }
1592
1593 Acore::VisibleNotifier notifierNoLarge(
1594 *this, mapChange,
1595 false); // visit only objects which are not large; default distance
1596 Cell::VisitAllObjects(m_seer, notifierNoLarge,
1598 notifierNoLarge.SendToSelf();
1599
1600 Acore::VisibleNotifier notifierLarge(
1601 *this, mapChange, true); // visit only large objects; maximum distance
1602 Cell::VisitAllObjects(m_seer, notifierLarge, GetSightRange());
1603 notifierLarge.SendToSelf();
1604
1605 if (mapChange)
1606 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1607}
#define VISIBILITY_INC_FOR_GOBJECTS
Definition ObjectDefines.h:28
float GetSightRange(WorldObject const *target=nullptr) const override
Definition Player.cpp:16321
Position m_last_notify_position
Definition Unit.h:2022
Definition GridNotifiers.h:44
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:206

References GetSightRange(), Unit::m_last_notify_position, m_seer, Position::Relocate(), Acore::VisibleNotifier::SendToSelf(), VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

Referenced by WorldSession::HandleFarSightOpcode(), SendInitialPacketsAfterAddToMap(), and UpdateObjectVisibility().

◆ UpdateVisibilityOf() [1/2]

template<class T >
void Player::UpdateVisibilityOf ( T *  target,
UpdateData data,
std::vector< Unit * > &  visibleNow 
)
1677{
1678 if (HaveAtClient(target))
1679 {
1680 if (!CanSeeOrDetect(target, false, true))
1681 {
1682 BeforeVisibilityDestroy<T>(target, this);
1683
1684 target->BuildOutOfRangeUpdateBlock(&data);
1685 m_clientGUIDs.erase(target->GetGUID());
1686 }
1687 }
1688 else
1689 {
1690 if (CanSeeOrDetect(target, false, true))
1691 {
1692 target->BuildCreateUpdateBlockForPlayer(&data, this);
1693 UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
1694 }
1695 }
1696}
void UpdateVisibilityOf_helper(GuidUnorderedSet &s64, T *target, std::vector< Unit * > &)
Definition PlayerUpdates.cpp:1630
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11449
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1737

References WorldObject::CanSeeOrDetect(), HaveAtClient(), m_clientGUIDs, and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1710{
1711 if (HaveAtClient(target))
1712 {
1713 if (!CanSeeOrDetect(target, false, true))
1714 {
1715 if (target->IsCreature())
1717
1718 target->DestroyForPlayer(this);
1719 m_clientGUIDs.erase(target->GetGUID());
1720 }
1721 }
1722 else
1723 {
1724 if (CanSeeOrDetect(target, false, true))
1725 {
1726 target->SendUpdateToPlayer(this);
1727 m_clientGUIDs.insert(target->GetGUID());
1728
1729 // target aura duration for caster show only if target exist at
1730 // caster client send data at target visibility change (adding to
1731 // client)
1732 if (target->IsUnit())
1733 GetInitialVisiblePackets((Unit*) target);
1734 }
1735 }
1736}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition PlayerUpdates.cpp:1668
void GetInitialVisiblePackets(Unit *target)
Definition PlayerUpdates.cpp:1698

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), Object::GetGUID(), GetInitialVisiblePackets(), HaveAtClient(), Object::IsCreature(), Object::IsUnit(), m_clientGUIDs, Object::SendUpdateToPlayer(), and Object::ToCreature().

Referenced by instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), Acore::VisibleNotifier::SendToSelf(), SetViewpoint(), Acore::VisibleNotifier::Visit(), Acore::VisibleNotifier::Visit(), Acore::PlayerRelocationNotifier::Visit(), and Acore::CreatureRelocationNotifier::Visit().

◆ UpdateWeaponSkill()

void Player::UpdateWeaponSkill ( Unit victim,
WeaponAttackType  attType,
Item item = nullptr 
)
975{
976 if (IsInFeralForm())
977 return; // always maximized SKILL_FERAL_COMBAT in fact
978
980 return; // use weapon but not skill up
981
982 if (victim->IsCreature() &&
985 return;
986
987 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
988
989 Item* tmpitem = GetWeaponForAttack(attType, true);
990 if (item && item != tmpitem && !item->IsBroken())
991 {
992 tmpitem = item;
993 }
994
995 if (!tmpitem && attType == BASE_ATTACK)
996 {
997 // Keep unarmed & fist weapon skills in sync
998 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
999 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
1000 }
1001 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
1003 {
1004 switch (tmpitem->GetTemplate()->SubClass)
1005 {
1007 break;
1009 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
1010 [[fallthrough]];
1011 default:
1012 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
1013 break;
1014 }
1015 }
1016
1018}
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition CreatureData.h:63
@ CONFIG_SKILL_GAIN_WEAPON
Definition IWorld.h:274
@ ITEM_SUBCLASS_WEAPON_FIST
Definition ItemTemplate.h:357
@ FORM_TREE
Definition UnitDefines.h:71

References BASE_ATTACK, CONFIG_SKILL_GAIN_WEAPON, CREATURE_FLAG_EXTRA_NO_SKILL_GAINS, CreatureTemplate::flags_extra, FORM_TREE, Creature::GetCreatureTemplate(), Unit::GetShapeshiftForm(), Item::GetSkill(), Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), Object::IsCreature(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea 
)
1248{
1249 if (!newZone)
1250 {
1251 return;
1252 }
1253
1254 if (m_zoneUpdateId != newZone)
1255 {
1256 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1257 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1258 sWorldState->HandlePlayerLeaveZone(this, static_cast<WorldStateZoneId>(m_zoneUpdateId));
1259 sWorldState->HandlePlayerEnterZone(this, static_cast<WorldStateZoneId>(newZone));
1260 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1261 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1262 SendInitWorldStates(newZone,
1263 newArea); // only if really enters to new zone, not
1264 // just area change, works strange...
1265 if (Guild* guild = GetGuild())
1266 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1267 }
1268
1269 // group update
1270 if (GetGroup())
1272
1273 m_zoneUpdateId = newZone;
1275
1276 // zone changed, so area changed as well, update it
1277 UpdateArea(newArea);
1278
1279 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1280 if (!zone)
1281 return;
1282
1283 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1284 {
1285 if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
1286 weather->SendWeatherUpdateToPlayer(this);
1287 else if (!WeatherMgr::AddWeather(zone->ID))
1288 // send fine weather packet to remove old zone's weather
1290 }
1291
1292 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1293
1294 // in PvP, any not controlled zone (except zone->team == 6, default case)
1295 // in PvE, only opposition team capital
1296 switch (zone->team)
1297 {
1298 case AREATEAM_ALLY:
1300 GetTeamId(true) != TEAM_ALLIANCE &&
1301 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1302 break;
1303 case AREATEAM_HORDE:
1305 GetTeamId(true) != TEAM_HORDE &&
1306 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1307 break;
1308 case AREATEAM_NONE:
1309 // overwrite for battlegrounds, maybe batter some zone flags but current
1310 // known not 100% fit to this
1311 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1313 break;
1314 default: // 6 in fact
1315 pvpInfo.IsInHostileArea = false;
1316 break;
1317 }
1318
1319 // Treat players having a quest flagging for PvP as always in hostile area
1321
1322 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1323 {
1324 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1326
1327 pvpInfo.IsInNoPvPArea = true;
1328 }
1329 else
1330 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1331
1333
1334 // remove items with area/map limitations (delete only for alive player to
1335 // allow back in ghost mode) if player resurrected at teleport this will be
1336 // applied in resurrect code
1337 if (IsAlive())
1338 DestroyZoneLimitedItem(true, newZone);
1339
1340 // check some item equip limitations (in result lost CanTitanGrip at talent
1341 // reset, for example)
1343
1344 // recent client version not send leave/join channel packets for built-in
1345 // local channels
1346 UpdateLocalChannels(newZone);
1347
1348 UpdateZoneDependentAuras(newZone);
1349}
@ AREATEAM_HORDE
Definition DBCEnums.h:58
@ AREATEAM_NONE
Definition DBCEnums.h:56
@ AREATEAM_ALLY
Definition DBCEnums.h:57
@ AREA_FLAG_CAPITAL
Definition DBCEnums.h:242
@ AREA_FLAG_WINTERGRASP
Definition DBCEnums.h:258
@ GROUP_UPDATE_FULL
Definition Group.h:121
@ GUILD_MEMBER_DATA_ZONEID
Definition Guild.h:58
@ CONFIG_WEATHER
Definition IWorld.h:94
@ REST_FLAG_IN_CITY
Definition Player.h:820
void UpdateLocalChannels(uint32 newZone)
Definition PlayerUpdates.cpp:502
void SendInitWorldStates(uint32 zone, uint32 area)
Definition Player.cpp:8222
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition PlayerStorage.cpp:3312
Weather for one zone.
Definition Weather.h:64
Weather * AddWeather(uint32 zone_id)
Add a Weather object to the list.
Definition WeatherMgr.cpp:66
void SendFineWeatherUpdateToPlayer(Player *player)
Definition WeatherMgr.cpp:144
Weather * FindWeather(uint32 id)
Find a Weather object by the given zoneid.
Definition WeatherMgr.cpp:49
uint32 ID
Definition DBCStructure.h:519
uint32 team
Definition DBCStructure.h:528

References WeatherMgr::AddWeather(), AREA_FLAG_CAPITAL, AREA_FLAG_WINTERGRASP, AREATEAM_ALLY, AREATEAM_HORDE, AREATEAM_NONE, AutoUnequipOffhandIfNeed(), CONFIG_WEATHER, DestroyZoneLimitedItem(), WeatherMgr::FindWeather(), AreaTableEntry::flags, GetGroup(), GetGuild(), GetTeamId(), GROUP_UPDATE_FULL, GUILD_MEMBER_DATA_ZONEID, HasPvPForcingQuest(), AreaTableEntry::ID, InBattleground(), Unit::IsAlive(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_zoneUpdateId, m_zoneUpdateTimer, pvpInfo, RemoveRestFlag(), REST_FLAG_IN_CITY, sAreaTableStore, sBattlefieldMgr, WeatherMgr::SendFineWeatherUpdateToPlayer(), SendInitWorldStates(), SetGroupUpdateFlag(), SetRestFlag(), sOutdoorPvPMgr, sScriptMgr, sWorld, sWorldState, AreaTableEntry::team, TEAM_ALLIANCE, TEAM_HORDE, UpdateArea(), UpdateLocalChannels(), UpdatePvPState(), UpdateZoneDependentAuras(), and ZONE_UPDATE_INTERVAL.

Referenced by WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), ResurrectPlayer(), SendInitialPacketsAfterAddToMap(), Update(), and UpdatePosition().

◆ UpdateZoneDependentAuras()

void Player::UpdateZoneDependentAuras ( uint32  zone_id)
1846{
1847 // Some spells applied at enter into zone (with subzones), aura removed in
1848 // UpdateAreaDependentAuras that called always at zone->area update
1849 SpellAreaForAreaMapBounds saBounds =
1850 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1851 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1852 itr != saBounds.second; ++itr)
1853 if (itr->second->autocast &&
1854 itr->second->IsFitToRequirements(this, newZone, 0))
1855 if (!HasAura(itr->second->spellId))
1856 CastSpell(this, itr->second->spellId, true);
1857}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9606{
9607 Creature* vehicle = GetVehicleCreatureBase();
9608 if (!vehicle)
9609 return;
9610
9611 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9612
9613 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9614 data << vehicle->GetGUID(); // Guid
9615 data << uint16(0); // Pet Family (0 for all vehicles)
9616 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9617 // The following three segments are read by the client as one uint32
9618 data << uint8(vehicle->GetReactState()); // React State
9619 data << uint8(0); // Command State
9620 data << uint16(0x800); // DisableActions (set for all vehicles)
9621
9622 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9623 {
9624 uint32 spellId = vehicle->m_spells[i];
9625 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9626 if (!spellInfo)
9627 {
9628 data << uint16(0) << uint8(0) << uint8(i + 8);
9629 continue;
9630 }
9631
9632 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9633 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9634 {
9635 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9636 data << uint16(0) << uint8(0) << uint8(i + 8);
9637 continue;
9638 }
9639
9640 if (spellInfo->IsPassive())
9641 vehicle->CastSpell(vehicle, spellId, true);
9642
9643 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9644 }
9645
9647 data << uint32(0);
9648
9649 data << uint8(0); // Auras?
9650
9651 // Cooldowns
9652 data << uint8(cooldownCount);
9653
9654 uint32 curTime = GameTime::GetGameTimeMS().count();
9656
9657 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9658 {
9659 uint16 category = itr->second.category;
9660 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9661
9662 data << uint32(itr->first); // spellid
9663 data << uint16(itr->second.category); // spell category
9664
9665 // send infinity cooldown in special format
9666 if (itr->second.end >= infTime)
9667 {
9668 data << uint32(1); // cooldown
9669 data << uint32(0x80000000); // category cooldown
9670 continue;
9671 }
9672
9673 data << uint32(category ? 0 : cooldown); // cooldown
9674 data << uint32(category ? cooldown : 0); // category cooldown
9675 }
9676
9677 GetSession()->SendPacket(&data);
9678}
#define MAX_SPELL_CONTROL_BAR
Definition CharmInfo.h:27
static constexpr uint32 MAX_CREATURE_SPELLS
Definition Unit.h:45
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition Creature.h:253
uint32 GetTimer()
Definition TemporarySummon.h:58
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:18813
TempSummon * ToTempSummon()
Definition Unit.h:702
bool IsSummon() const
Definition Unit.h:760

References Unit::CastSpell(), Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Creature::GetReactState(), GetSession(), TempSummon::GetTimer(), Unit::GetVehicleCreatureBase(), infinityCooldownDelayCheck, SpellInfo::IsPassive(), Unit::IsSummon(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Creature::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_CREATURE_SPELLS, MAX_SPELL_CONTROL_BAR, sConditionMgr, WorldSession::SendPacket(), SMSG_PET_SPELLS, sSpellMgr, Object::ToCreature(), and Unit::ToTempSummon().

Referenced by Unit::SetCharmedBy().

◆ VisualizeItem()

void Player::VisualizeItem ( uint8  slot,
Item pItem 
)
2876{
2877 if (!pItem)
2878 return;
2879
2880 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2882 pItem->SetBinding(true);
2883
2884 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2885
2886 m_items[slot] = pItem;
2887 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2890 pItem->SetSlot(slot);
2891 pItem->SetContainer(nullptr);
2892
2893 if (slot < EQUIPMENT_SLOT_END)
2894 SetVisibleItemSlot(slot, pItem);
2895
2896 pItem->SetState(ITEM_CHANGED, this);
2897}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, EQUIPMENT_SLOT_END, Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), Item::GetTemplate(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, Item::SetBinding(), Item::SetContainer(), Object::SetGuidValue(), Item::SetSlot(), Item::SetState(), and SetVisibleItemSlot().

Referenced by EquipItem(), and QuickEquipItem().

◆ Whisper() [1/2]

void Player::Whisper ( std::string_view  text,
Language  language,
Player receiver,
bool  = false 
)
overridevirtual

Handles whispers from Addons and players based on sender, receiver's guid and language.

Reimplemented from Unit.

9439{
9440 ASSERT(target);
9441
9442 bool isAddonMessage = language == LANG_ADDON;
9443
9444 if (!isAddonMessage) // if not addon data
9445 language = LANG_UNIVERSAL; // whispers should always be readable
9446
9447 std::string _text(text);
9448
9449 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9450 {
9451 return;
9452 }
9453
9454 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9455
9456 WorldPacket data;
9457 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9458 target->GetSession()->SendPacket(&data);
9459
9460 // rest stuff shouldn't happen in case of addon message
9461 if (isAddonMessage)
9462 return;
9463
9464 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9465 GetSession()->SendPacket(&data);
9466
9467 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9468 {
9469 SetAcceptWhispers(true);
9471 }
9472
9473 // announce afk or dnd message
9474 if (target->isAFK())
9475 {
9476 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName(), target->autoReplyMsg);
9477 }
9478 else if (target->isDND())
9479 {
9480 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName(), target->autoReplyMsg);
9481 }
9482}
@ LANG_PLAYER_DND
Definition Language.h:673
@ LANG_PLAYER_AFK
Definition Language.h:674
@ LANG_COMMAND_WHISPERON
Definition Language.h:331
@ CHAT_MSG_WHISPER_INFORM
Definition SharedDefines.h:3161
@ CHAT_MSG_WHISPER
Definition SharedDefines.h:3159
Language
Definition SharedDefines.h:734
@ LANG_ADDON
Definition SharedDefines.h:753
bool isAcceptWhispers() const
Definition Player.h:1173

References ASSERT, autoReplyMsg, ChatHandler::BuildChatPacket(), CHAT_MSG_WHISPER, CHAT_MSG_WHISPER_INFORM, WorldObject::GetName(), GetSession(), isAcceptWhispers(), isAFK(), isDND(), IsGameMaster(), LANG_ADDON, LANG_COMMAND_WHISPERON, LANG_PLAYER_AFK, LANG_PLAYER_DND, LANG_UNIVERSAL, ChatHandler::PSendSysMessage(), WorldSession::SendPacket(), ChatHandler::SendSysMessage(), SetAcceptWhispers(), and sScriptMgr.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Whisper() [2/2]

void Player::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
overridevirtual

Reimplemented from Unit.

9485{
9486 if (!target)
9487 return;
9488
9489 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9490 if (!bct)
9491 {
9492 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9493 return;
9494 }
9495
9497 WorldPacket data;
9498 if (isBossWhisper)
9499 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9500 else
9501 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9502 target->SendDirectMessage(&data);
9503}
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3194
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition ObjectMgr.h:456

References ChatHandler::BuildChatPacket(), CHAT_MSG_RAID_BOSS_WHISPER, CHAT_MSG_WHISPER, Unit::getGender(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Player::Yell ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles yelled message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9396{
9397 std::string _text(text);
9398
9399 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_YELL, language, _text))
9400 {
9401 return;
9402 }
9403
9404 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9405
9406 WorldPacket data;
9407 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9408 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true, false, false, true);
9409}
@ CONFIG_LISTEN_RANGE_YELL
Definition IWorld.h:197
@ CHAT_MSG_YELL
Definition SharedDefines.h:3158

References ChatHandler::BuildChatPacket(), CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Yell() [2/2]

void Player::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9412{
9413 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9414}

References CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Friends And Related Symbol Documentation

◆ CinematicMgr

friend class CinematicMgr
friend

Referenced by Player().

◆ Item::AddToUpdateQueueOf

void Item::AddToUpdateQueueOf ( Player player)
friend

◆ Item::RemoveFromUpdateQueueOf

void Item::RemoveFromUpdateQueueOf ( Player player)
friend

◆ WorldSession

friend class WorldSession
friend

Member Data Documentation

◆ _activeCheats

uint32 Player::_activeCheats
private

◆ _BgBattlegroundQueueID

◆ _cinematicMgr

CinematicMgr* Player::_cinematicMgr
private

◆ _corpseLocation

◆ _farSightDistance

Optional<float> Player::_farSightDistance = { }
private

◆ _innTriggerId

uint32 Player::_innTriggerId
protected

◆ _instanceResetTimes

◆ _pendingBindId

uint32 Player::_pendingBindId
private

◆ _pendingBindTimer

uint32 Player::_pendingBindTimer
private

Referenced by SetPendingBind(), and Update().

◆ _restBonus

float Player::_restBonus
protected

◆ _restFlagMask

uint32 Player::_restFlagMask
protected

◆ _restTime

time_t Player::_restTime
protected

◆ _wasOutdoor

bool Player::_wasOutdoor
private

◆ autoReplyMsg

std::string Player::autoReplyMsg

◆ bgZoneIdToFillWorldStates

std::unordered_map< int, bgZoneRef > Player::bgZoneIdToFillWorldStates = {}
static
16275{
16276 SPELLMOD_FLAT = 107, // SPELL_AURA_ADD_FLAT_MODIFIER
16277 SPELLMOD_PCT = 108 // SPELL_AURA_ADD_PCT_MODIFIER
16278};
16279
16280// 2^n values, Player::m_isunderwater is a bitmask. These are Trinity internal values, they are never send to any client
16282{
16283 UNDERWATER_NONE = 0x00,
16284 UNDERWATER_INWATER = 0x01, // terrain type is water and player is afflicted by it
16285 UNDERWATER_INLAVA = 0x02, // terrain type is lava and player is afflicted by it
16286 UNDERWATER_INSLIME = 0x04, // terrain type is lava and player is afflicted by it
16287 UNDERWATER_INDARKWATER = 0x08, // terrain type is dark water and player is afflicted by it
16288
16290};
16291
16293{
16297 ERR_BANKSLOT_OK = 3
16298};
16299
16301{
16304 PLAYERSPELL_NEW = 2,
16307};
16308
16309struct PlayerSpell
16310{
16311 PlayerSpellState State : 7; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)!
16312 bool Active : 1; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)! lower rank of a spell are not useable, but learnt
16313 uint8 specMask : 8;
16314 bool IsInSpec(uint8 spec) { return (specMask & (1 << spec)); }
16315};
16316
16317struct PlayerTalent
16318{
16319 PlayerSpellState State : 8; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)!
16320 uint8 specMask : 8;
16321 uint32 talentID;
16322 bool inSpellBook;
16323 bool IsInSpec(uint8 spec) { return (specMask & (1 << spec)); }
16324};
16325
16326enum TalentTree // talent tabs
16327{
16358};
16359
16360#define SPEC_MASK_ALL 255
16361
16362// Spell modifier (used for modify other spells)
16363struct SpellModifier
16364{
16365 SpellModifier(Aura* _ownerAura = nullptr) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), mask(), ownerAura(_ownerAura) {}
16366 SpellModOp op : 8;
16367 SpellModType type : 8;
16368 int16 charges : 16;
16369 int32 value{0};
16370 flag96 mask;
16371 uint32 spellId{0};
16372 Aura* const ownerAura;
16373};
16374
16375typedef std::unordered_map<uint32, PlayerTalent*> PlayerTalentMap;
16376typedef std::unordered_map<uint32, PlayerSpell*> PlayerSpellMap;
16377typedef std::list<SpellModifier*> SpellModList;
16378
16380
16381struct SpellCooldown
16382{
16383 uint32 end;
16384 uint16 category;
16385 uint32 itemid;
16386 uint32 maxduration;
16387 bool sendToSpectator: 1;
16388 bool needSendToClient: 1;
16389};
16390
16391typedef std::map<uint32, SpellCooldown> SpellCooldowns;
16392typedef std::unordered_map<uint32 /*instanceId*/, time_t/*releaseTime*/> InstanceTimeMap;
16393
16395{
16399 TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed
16400};
16401
16403{
16406 ACTIONBUTTON_NEW = 2,
16408};
16409
16411{
16412 ACTION_BUTTON_SPELL = 0x00,
16413 ACTION_BUTTON_C = 0x01, // click?
16414 ACTION_BUTTON_EQSET = 0x20,
16415 ACTION_BUTTON_MACRO = 0x40,
16417 ACTION_BUTTON_ITEM = 0x80
16418};
16419
16421{
16429};
16430
16431enum QuestSound
16432{
16434};
16435
16436#define ACTION_BUTTON_ACTION(X) (uint32(X) & 0x00FFFFFF)
16437#define ACTION_BUTTON_TYPE(X) ((uint32(X) & 0xFF000000) >> 24)
16438#define MAX_ACTION_BUTTON_ACTION_VALUE (0x00FFFFFF+1)
16439
16440struct ActionButton
16441{
16442 ActionButton() = default;
16443
16444 uint32 packedData{0};
16446
16447 // helpers
16448 [[nodiscard]] ActionButtonType GetType() const { return ActionButtonType(ACTION_BUTTON_TYPE(packedData)); }
16449 [[nodiscard]] uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); }
16450 void SetActionAndType(uint32 action, ActionButtonType type)
16451 {
16452 uint32 newData = action | (uint32(type) << 24);
16453 if (newData != packedData || uState == ACTIONBUTTON_DELETED)
16454 {
16455 packedData = newData;
16456 if (uState != ACTIONBUTTON_NEW)
16457 uState = ACTIONBUTTON_CHANGED;
16458 }
16459 }
16460};
16461
16462#define MAX_ACTION_BUTTONS 144 //checked in 3.2.0
16463
16464typedef std::map<uint8, ActionButton> ActionButtonList;
16465
16467{
16468 PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {}
16469
16470 uint32 item_id;
16471 uint32 item_amount;
16472};
16473
16474typedef std::list<PlayerCreateInfoItem> PlayerCreateInfoItems;
16475
16477{
16478 PlayerClassLevelInfo() = default;
16479 uint32 basehealth{0};
16480 uint32 basemana{0};
16481};
16482
16483struct PlayerClassInfo
16484{
16485 PlayerClassInfo() = default;
16486
16487 PlayerClassLevelInfo* levelInfo{nullptr}; //[level-1] 0..MaxPlayerLevel-1
16488};
16489
16490struct PlayerLevelInfo
16491{
16493 {
16494 stats.fill(0);
16495 }
16496
16497 std::array<uint32, MAX_STATS> stats = { };
16498};
16499
16500typedef std::list<uint32> PlayerCreateInfoSpells;
16501
16503{
16504 PlayerCreateInfoAction() = default;
16505 PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) {}
16506
16507 uint8 button{0};
16508 uint8 type{0};
16509 uint32 action{0};
16510};
16511
16512typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions;
16513
16515{
16516 uint16 SkillId;
16517 uint16 Rank;
16518};
16519
16520typedef std::list<PlayerCreateInfoSkill> PlayerCreateInfoSkills;
16521
16522struct PlayerInfo
16523{
16524 // existence checked by displayId != 0
16525 PlayerInfo() = default;
16526
16527 uint32 mapId{0};
16528 uint32 areaId{0};
16529 float positionX{0.0f};
16530 float positionY{0.0f};
16531 float positionZ{0.0f};
16532 float orientation{0.0f};
16533 uint16 displayId_m{0};
16534 uint16 displayId_f{0};
16536 PlayerCreateInfoSpells customSpells;
16537 PlayerCreateInfoSpells castSpells;
16540
16541 PlayerLevelInfo* levelInfo{nullptr}; //[level-1] 0..MaxPlayerLevel-1
16542};
16543
16544struct PvPInfo
16545{
16546 PvPInfo() = default;
16547
16548 bool IsHostile{false};
16549 bool IsInHostileArea{false};
16550 bool IsInNoPvPArea{false};
16551 bool IsInFFAPvPArea{false};
16552 time_t EndTimer{0};
16553 time_t FFAPvPEndTimer{0};
16554};
16555
16556enum DuelState
16557{
16562};
16563
16564struct DuelInfo
16565{
16566 DuelInfo(Player* opponent, Player* initiator, bool isMounted) : Opponent(opponent), Initiator(initiator), IsMounted(isMounted) {}
16567
16568 Player* const Opponent;
16569 Player* const Initiator;
16570 bool const IsMounted;
16572 time_t StartTime = 0;
16573 time_t OutOfBoundsTime = 0;
16574};
16575
16576struct Areas
16577{
16578 uint32 areaID;
16579 uint32 areaFlag;
16580 float x1;
16581 float x2;
16582 float y1;
16583 float y2;
16584};
16585
16586#define MAX_RUNES 6
16587
16588enum RuneCooldowns
16589{
16590 RUNE_BASE_COOLDOWN = 10000,
16591 RUNE_GRACE_PERIOD = 2500, // xinef: maximum possible grace period
16592 RUNE_MISS_COOLDOWN = 1500, // cooldown applied on runes when the spell misses
16593};
16594
16595enum RuneType
16596{
16597 RUNE_BLOOD = 0,
16598 RUNE_UNHOLY = 1,
16599 RUNE_FROST = 2,
16600 RUNE_DEATH = 3,
16601 NUM_RUNE_TYPES = 4
16602};
16603
16604struct RuneInfo
16605{
16606 uint8 BaseRune;
16607 uint8 CurrentRune;
16608 uint32 Cooldown;
16609 uint32 GracePeriod;
16610 AuraEffect const* ConvertAura;
16611};
16612
16613struct Runes
16614{
16615 RuneInfo runes[MAX_RUNES];
16616 uint8 runeState; // mask of available runes
16617 RuneType lastUsedRune;
16618
16619 void SetRuneState(uint8 index, bool set = true)
16620 {
16621 if (set)
16622 runeState |= (1 << index); // usable
16623 else
16624 runeState &= ~(1 << index); // on cooldown
16625 }
16626};
16627
16628struct EnchantDuration
16629{
16630 EnchantDuration() = default;
16631 EnchantDuration(Item* _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot),
16632 leftduration(_leftduration) { ASSERT(item); };
16633
16634 Item* item{nullptr};
16636 uint32 leftduration{0};
16637};
16638
16639typedef std::list<EnchantDuration> EnchantDurationList;
16640typedef std::list<Item*> ItemDurationList;
16641
16643{
16644 MOVE_ROOT = 1,
16645 MOVE_UNROOT = 2,
16646 MOVE_WATER_WALK = 3,
16647 MOVE_LAND_WALK = 4
16648};
16649
16650enum DrunkenState
16651{
16652 DRUNKEN_SOBER = 0,
16653 DRUNKEN_TIPSY = 1,
16654 DRUNKEN_DRUNK = 2,
16655 DRUNKEN_SMASHED = 3
16656};
16657
16658#define MAX_DRUNKEN 4
16659
16660enum PlayerFlags : uint32
16661{
16662 PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
16663 PLAYER_FLAGS_AFK = 0x00000002,
16664 PLAYER_FLAGS_DND = 0x00000004,
16665 PLAYER_FLAGS_GM = 0x00000008,
16666 PLAYER_FLAGS_GHOST = 0x00000010,
16667 PLAYER_FLAGS_RESTING = 0x00000020,
16668 PLAYER_FLAGS_UNK6 = 0x00000040,
16669 PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
16670 PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
16671 PLAYER_FLAGS_IN_PVP = 0x00000200,
16672 PLAYER_FLAGS_HIDE_HELM = 0x00000400,
16673 PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
16674 PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time
16675 PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time
16676 PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000,
16677 PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something?
16678 PLAYER_FLAGS_UNK16 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
16679 PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
16680 PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
16681 PLAYER_FLAGS_UBER = 0x00080000,
16682 PLAYER_FLAGS_UNK20 = 0x00100000,
16683 PLAYER_FLAGS_UNK21 = 0x00200000,
16684 PLAYER_FLAGS_COMMENTATOR2 = 0x00400000,
16685 PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_USES_RANGED_SLOT, SPELL_EFFECT_ATTACK, checked only for active player
16686 PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack
16687 PLAYER_FLAGS_NO_XP_GAIN = 0x02000000,
16688 PLAYER_FLAGS_UNK26 = 0x04000000,
16689 PLAYER_FLAGS_UNK27 = 0x08000000,
16690 PLAYER_FLAGS_UNK28 = 0x10000000,
16691 PLAYER_FLAGS_UNK29 = 0x20000000,
16692 PLAYER_FLAGS_UNK30 = 0x40000000,
16693 PLAYER_FLAGS_UNK31 = 0x80000000,
16694};
16695
16697
16698enum PlayerBytesOffsets //@todo: Implement
16699{
16704};
16705
16706enum PlayerBytes2Offsets //@todo: Implement
16707{
16712};
16713
16714enum PlayerBytes3Offsets //@todo: Implement
16715{
16720};
16721
16722enum PlayerFieldBytesOffsets //@todo: Implement
16723{
16728};
16729
16731{
16735};
16736
16737static_assert((PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID & 1) == 0, "PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID must be aligned to 2 byte boundary");
16738
16739#define PLAYER_BYTES_2_OVERRIDE_SPELLS_UINT16_OFFSET (PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID / 2)
16740
16741#define KNOWN_TITLES_SIZE 3
16742#define MAX_TITLE_INDEX (KNOWN_TITLES_SIZE*64) // 3 uint64 fields
16743
16744// used in PLAYER_FIELD_BYTES values
16746{
16748 PLAYER_FIELD_BYTE_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit
16749 PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW = 0x00000010 // Display no "release spirit" window at all
16750};
16751
16752// used in PLAYER_FIELD_BYTES2 values
16754{
16758};
16759
16760enum MirrorTimerType
16761{
16762 FATIGUE_TIMER = 0,
16763 BREATH_TIMER = 1,
16764 FIRE_TIMER = 2
16765};
16766#define MAX_TIMERS 3
16767#define DISABLED_MIRROR_TIMER -1
16768
16769// 2^n values
16771{
16772 // gm abilities
16773 PLAYER_EXTRA_GM_ON = 0x0001,
16775 PLAYER_EXTRA_TAXICHEAT = 0x0008,
16777 PLAYER_EXTRA_GM_CHAT = 0x0020, // Show GM badge in chat messages
16778 PLAYER_EXTRA_HAS_310_FLYER = 0x0040, // Marks if player already has 310% speed flying mount
16779 PLAYER_EXTRA_SPECTATOR_ON = 0x0080, // Marks if player is spectactor
16780 PLAYER_EXTRA_PVP_DEATH = 0x0100, // store PvP death status until corpse creating.
16781 PLAYER_EXTRA_SHOW_DK_PET = 0x0400, // Marks if player should see ghoul on login screen
16782};
16783
16784// 2^n values
16785enum AtLoginFlags
16786{
16787 AT_LOGIN_NONE = 0x00,
16788 AT_LOGIN_RENAME = 0x01,
16789 AT_LOGIN_RESET_SPELLS = 0x02,
16791 AT_LOGIN_CUSTOMIZE = 0x08,
16793 AT_LOGIN_FIRST = 0x20,
16795 AT_LOGIN_CHANGE_RACE = 0x80,
16796 AT_LOGIN_RESET_AP = 0x100,
16797 AT_LOGIN_RESET_ARENA = 0x200,
16798 AT_LOGIN_CHECK_ACHIEVS = 0x400,
16799 AT_LOGIN_RESURRECT = 0x800
16800};
16801
16802typedef std::map<uint32, QuestStatusData> QuestStatusMap;
16803typedef std::unordered_set<uint32> RewardedQuestSet;
16804
16805// quest, keep
16806typedef std::map<uint32, bool> QuestStatusSaveMap;
16807
16809{
16810 QUEST_ID_OFFSET = 0,
16814};
16815
16816#define MAX_QUEST_OFFSET 5
16817
16819{
16820 QUEST_STATE_NONE = 0x0000,
16821 QUEST_STATE_COMPLETE = 0x0001,
16822 QUEST_STATE_FAIL = 0x0002
16823};
16824
16826{
16827 SKILL_UNCHANGED = 0,
16828 SKILL_CHANGED = 1,
16829 SKILL_NEW = 2,
16830 SKILL_DELETED = 3
16831};
16832
16833struct SkillStatusData
16834{
16835 SkillStatusData(uint8 _pos, SkillUpdateState _uState) : pos(_pos), uState(_uState)
16836 {
16837 }
16838 uint8 pos;
16839 SkillUpdateState uState;
16840};
16841
16842typedef std::unordered_map<uint32, SkillStatusData> SkillStatusMap;
16843
16844class Quest;
16845class Spell;
16846class Item;
16847class WorldSession;
16848
16849enum PlayerSlots
16850{
16851 // first slot for item stored (in any way in player m_items data)
16853 // last+1 slot for item stored (in any way in player m_items data)
16854 PLAYER_SLOT_END = 150,
16856};
16857
16858#define INVENTORY_SLOT_BAG_0 255
16859
16860enum EquipmentSlots // 19 slots
16861{
16883};
16884
16885enum InventorySlots // 4 slots
16886{
16889};
16890
16891enum InventoryPackSlots // 16 slots
16892{
16895};
16896
16897enum BankItemSlots // 28 slots
16898{
16901};
16902
16903enum BankBagSlots // 7 slots
16904{
16907};
16908
16909enum BuyBackSlots // 12 slots
16910{
16911 // stored in m_items, there is no more m_buybackitems
16912 BUYBACK_SLOT_START = 74,
16913 BUYBACK_SLOT_END = 86
16914};
16915
16916enum KeyRingSlots // 32 slots
16917{
16918 KEYRING_SLOT_START = 86,
16919 KEYRING_SLOT_END = 118
16920};
16921
16922enum CurrencyTokenSlots // 32 slots
16923{
16926};
16927
16929{
16934};
16935
16936struct EquipmentSet
16937{
16938 EquipmentSet() = default;
16939
16940 uint64 Guid;
16941 std::string Name;
16942 std::string IconName;
16943 uint32 IgnoreMask{0};
16946};
16947
16948#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
16949
16950typedef std::map<uint32, EquipmentSet> EquipmentSets;
16951
16952struct ItemPosCount
16953{
16954 ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
16955 [[nodiscard]] bool isContainedIn(std::vector<ItemPosCount> const& vec) const;
16956 uint16 pos;
16957 uint32 count;
16958};
16959typedef std::vector<ItemPosCount> ItemPosCountVec;
16960
16961struct SavedItem
16962{
16963 Item* item;
16964 uint16 dstpos;
16965
16966 SavedItem(Item* _item, uint16 dstpos) : item(_item), dstpos(dstpos) {}
16967};
16968
16970{
16971 TRANSFER_ABORT_NONE = 0x00,
16972 TRANSFER_ABORT_ERROR = 0x01,
16973 TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
16974 TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
16975 TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
16976 TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
16977 TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC, WotLK> expansion installed to access this area.
16978 TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal, Heroic, Epic> difficulty mode is not available for %s.
16979 TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
16980 TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
16981 TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
16982 TRANSFER_ABORT_NOT_FOUND1 = 0x0C, // 3.1
16983 TRANSFER_ABORT_NOT_FOUND2 = 0x0D, // 3.1
16984 TRANSFER_ABORT_NOT_FOUND3 = 0x0E, // 3.2
16985 TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm.
16986 TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time.
16987};
16988
16990{
16991 RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s).
16992 RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)!
16993 RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location!
16994 RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s.
16996};
16997
16998class InstanceSave;
16999
17000enum RestFlag
17001{
17002 REST_FLAG_IN_TAVERN = 0x1,
17003 REST_FLAG_IN_CITY = 0x2,
17004 REST_FLAG_IN_FACTION_AREA = 0x4, // used with AREA_FLAG_REST_ZONE_*
17005};
17006
17008{
17009 TELE_TO_GM_MODE = 0x01,
17013 TELE_TO_SPELL = 0x10,
17015 TELE_TO_WITH_PET = 0x40,
17017};
17018
17021{
17022 DAMAGE_EXHAUSTED = 0,
17023 DAMAGE_DROWNING = 1,
17024 DAMAGE_FALL = 2,
17025 DAMAGE_LAVA = 3,
17026 DAMAGE_SLIME = 4,
17027 DAMAGE_FIRE = 5,
17028 DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss
17029};
17030
17031enum PlayerChatTag
17032{
17033 CHAT_TAG_NONE = 0x00,
17034 CHAT_TAG_AFK = 0x01,
17035 CHAT_TAG_DND = 0x02,
17036 CHAT_TAG_GM = 0x04,
17037 CHAT_TAG_COM = 0x08, // Commentator tag. Do not exist in clean client
17038 CHAT_TAG_DEV = 0x10,
17039};
17040
17041enum PlayedTimeIndex
17042{
17045};
17046
17047#define MAX_PLAYED_TIME_INDEX 2
17048
17049// used at player loading query list preparing, and later result selection
17051{
17087};
17088
17090{
17091 DELAYED_SAVE_PLAYER = 0x01,
17099};
17100
17102{
17114};
17115
17116// Player summoning auto-decline time (in secs)
17117#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
17118#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
17119
17121{
17122 uint32 id;
17123 TeamId faction;
17124 std::string note;
17125 uint32 priority;
17126 bool checkLeaderOnly;
17127};
17128
17130{
17131 uint8 levelMin;
17132 uint8 levelMax;
17133 uint16 reqItemLevel;
17134 std::vector<ProgressionRequirement*> quests;
17135 std::vector<ProgressionRequirement*> items;
17136 std::vector<ProgressionRequirement*> achievements;
17137};
17138
17140{
17141 CHAR_DELETE_REMOVE = 0, // Completely remove from the database
17142 CHAR_DELETE_UNLINK = 1 // The character gets unlinked from the account,
17143 // the name gets freed up and appears as deleted ingame
17144};
17145
17146enum CurrencyItems
17147{
17148 ITEM_HONOR_POINTS_ID = 43308,
17149 ITEM_ARENA_POINTS_ID = 43307
17150};
17151
17153{
17168};
17169
17170enum PlayerRestState
17171{
17172 REST_STATE_RESTED = 0x01,
17175};
17176
17178{
17182};
17183
17185{
17186 CHEAT_NONE = 0x00,
17187 CHEAT_GOD = 0x01,
17188 CHEAT_CASTTIME = 0x02,
17189 CHEAT_COOLDOWN = 0x04,
17190 CHEAT_POWER = 0x08,
17191 CHEAT_WATERWALK = 0x10
17192};
17193
17194// Used for OnGiveXP PlayerScript hook
17195enum PlayerXPSource
17196{
17197 XPSOURCE_KILL = 0,
17198 XPSOURCE_QUEST = 1,
17200 XPSOURCE_EXPLORE = 3,
17202};
17203
17205{
17207};
17208
17210{
17212};
17213
17214std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
17215
17216class Player;
17217
17218// holder for Battleground data (pussywizard: not stored in db)
17219struct BGData
17220{
17221 BGData() = default;
17222
17223 uint32 bgInstanceID{0};
17225 TeamId bgTeamId{TEAM_NEUTRAL};
17227 bool isInvited{false};
17228 bool bgIsRandom{false};
17229
17230 GuidSet bgAfkReporter;
17231 uint8 bgAfkReportedCount{0};
17232 time_t bgAfkReportedTimer{0};
17233};
17234
17235// holder for Entry Point data (pussywizard: stored in db)
17236struct EntryPointData
17237{
17239 {
17240 ClearTaxiPath();
17241 }
17242
17243 uint32 mountSpell{0};
17244 std::array<uint32, 2> taxiPath;
17245 WorldLocation joinPos;
17246
17247 void ClearTaxiPath() { taxiPath.fill(0); }
17248 [[nodiscard]] bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; }
17249};
17250
17252{
17253 uint32 spellId;
17254 uint32 category;
17255 WorldPacket requestPacket;
17256 bool isItem = false;
17257 bool cancelInProgress = false;
17258
17259 PendingSpellCastRequest(uint32 spellId, uint32 category, WorldPacket&& packet, bool item = false, bool cancel = false)
17260 : spellId(spellId), category(category), requestPacket(std::move(packet)), isItem(item) , cancelInProgress(cancel) {}
17261};
17262
17263class Player : public Unit, public GridObject<Player>
17264{
17265 friend class WorldSession;
17266 friend class CinematicMgr;
17267 friend void Item::AddToUpdateQueueOf(Player* player);
17268 friend void Item::RemoveFromUpdateQueueOf(Player* player);
17269public:
17270 explicit Player(WorldSession* session);
17271 ~Player() override;
17272
17273 void CleanupsBeforeDelete(bool finalCleanup = true) override;
17274
17275 void AddToWorld() override;
17276 void RemoveFromWorld() override;
17277
17278 void SetObjectScale(float scale) override
17279 {
17280 Unit::SetObjectScale(scale);
17283 }
17284
17285 [[nodiscard]] bool hasSpanishClient()
17286 {
17288 }
17289
17290 bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0, Unit* target = nullptr, bool newInstance = false);
17291 bool TeleportTo(WorldLocation const& loc, uint32 options = 0, Unit* target = nullptr)
17292 {
17293 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
17294 }
17295 bool TeleportToEntryPoint();
17296
17297 void SetSummonPoint(uint32 mapid, float x, float y, float z, uint32 delay = 0, bool asSpectator = false);
17298 [[nodiscard]] bool IsSummonAsSpectator() const;
17299 void SetSummonAsSpectator(bool on) { m_summon_asSpectator = on; }
17300 void SummonIfPossible(bool agree, ObjectGuid summoner_guid);
17301 [[nodiscard]] time_t GetSummonExpireTimer() const { return m_summon_expire; }
17302
17303 bool Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo);
17304
17305 void Update(uint32 time) override;
17306
17308 bool HasPlayerFlag(PlayerFlags flags) const { return HasFlag(PLAYER_FLAGS, flags) != 0; }
17309 void SetPlayerFlag(PlayerFlags flags) { SetFlag(PLAYER_FLAGS, flags); }
17310 void RemovePlayerFlag(PlayerFlags flags) { RemoveFlag(PLAYER_FLAGS, flags); }
17312
17313 static bool BuildEnumData(PreparedQueryResult result, WorldPacket* data);
17314
17315 [[nodiscard]] bool IsClass(Classes playerClass, ClassContext context = CLASS_CONTEXT_NONE) const override;
17316
17317 void SetInWater(bool apply);
17318
17319 [[nodiscard]] bool IsInWater() const override { return m_isInWater; }
17320 [[nodiscard]] bool IsFalling() const;
17321 bool IsInAreaTriggerRadius(AreaTrigger const* trigger, float delta = 0.f) const;
17322
17325 void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0);
17326 void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap);
17327
17328 bool CanInteractWithQuestGiver(Object* questGiver);
17331
17332 void ToggleAFK();
17333 void ToggleDND();
17334 [[nodiscard]] bool isAFK() const { return HasPlayerFlag(PLAYER_FLAGS_AFK); }
17335 [[nodiscard]] bool isDND() const { return HasPlayerFlag(PLAYER_FLAGS_DND); }
17336 [[nodiscard]] uint8 GetChatTag() const;
17337 std::string autoReplyMsg;
17338
17339 uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin = nullptr);
17340
17341 PlayerSocial* GetSocial() { return m_social; }
17342
17345 bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = nullptr, uint32 spellid = 1);
17346 bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 1);
17348 void ContinueTaxiFlight();
17350 // mount_id can be used in scripting calls
17351
17352 [[nodiscard]] bool IsCommentator() const { return HasPlayerFlag(PLAYER_FLAGS_COMMENTATOR2); }
17354 [[nodiscard]] bool IsDeveloper() const { return HasPlayerFlag(PLAYER_FLAGS_DEVELOPER); }
17356 [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; }
17357 void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; }
17358 [[nodiscard]] bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
17359 void SetGameMaster(bool on);
17360 [[nodiscard]] bool isGMChat() const { return m_ExtraFlags & PLAYER_EXTRA_GM_CHAT; }
17361 void SetGMChat(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }
17362 [[nodiscard]] bool isTaxiCheater() const { return m_ExtraFlags & PLAYER_EXTRA_TAXICHEAT; }
17363 void SetTaxiCheater(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; }
17364 [[nodiscard]] bool isGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); }
17365 void SetGMVisible(bool on);
17366 bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId = 0);
17367 void SetHas310Flyer(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }
17368 void SetPvPDeath(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }
17369
17370 void GiveXP(uint32 xp, Unit* victim, float group_rate = 1.0f, bool isLFGReward = false);
17371 void GiveLevel(uint8 level);
17372
17373 void InitStatsForLevel(bool reapplyMods = false);
17374
17375 [[nodiscard]] bool HasActivePowerType(Powers power) override;
17376
17377 // .cheat command related
17378 [[nodiscard]] bool GetCommandStatus(uint32 command) const { return _activeCheats & command; }
17379 void SetCommandStatusOn(uint32 command) { _activeCheats |= command; }
17380 void SetCommandStatusOff(uint32 command) { _activeCheats &= ~command; }
17381
17382 // Played Time Stuff
17383 time_t m_logintime;
17384 time_t m_Last_tick;
17388
17389 void setDeathState(DeathState s, bool despawn = false) override; // overwrite Unit::setDeathState
17390
17391 void SetRestState(uint32 triggerId);
17392 void RemoveRestState();
17394 [[nodiscard]] float GetRestBonus() const { return _restBonus; }
17395 void SetRestBonus(float restBonusNew);
17396
17397 [[nodiscard]] bool HasRestFlag(RestFlag restFlag) const { return (_restFlagMask & restFlag) != 0; }
17398 void SetRestFlag(RestFlag restFlag, uint32 triggerId = 0);
17399 void RemoveRestFlag(RestFlag restFlag);
17400 [[nodiscard]] uint32 GetInnTriggerId() const { return _innTriggerId; }
17401
17402 PetStable* GetPetStable() { return m_petStable.get(); }
17404 [[nodiscard]] PetStable const* GetPetStable() const { return m_petStable.get(); }
17405
17406 [[nodiscard]] Pet* GetPet() const;
17407 Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration = 0s, uint32 healthPct = 0);
17408 void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false);
17409 bool CanPetResurrect();
17410 bool IsExistPet();
17411 Pet* CreatePet(Creature* creatureTarget, uint32 spellID = 0);
17412 Pet* CreatePet(uint32 creatureEntry, uint32 spellID = 0);
17413
17414 [[nodiscard]] uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
17415
17417 void Say(std::string_view text, Language language, WorldObject const* = nullptr) override;
17418 void Say(uint32 textId, WorldObject const* target = nullptr) override;
17420 void Yell(std::string_view text, Language language, WorldObject const* = nullptr) override;
17421 void Yell(uint32 textId, WorldObject const* target = nullptr) override;
17423 void TextEmote(std::string_view text, WorldObject const* = nullptr, bool = false) override;
17424 void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false) override;
17426 void Whisper(std::string_view text, Language language, Player* receiver, bool = false) override;
17427 void Whisper(uint32 textId, Player* target, bool isBossWhisper = false) override;
17428
17429 /*********************************************************/
17430 /*** STORAGE SYSTEM ***/
17431 /*********************************************************/
17432
17433 void SetVirtualItemSlot(uint8 i, Item* item);
17434 void SetSheath(SheathState sheathed) override; // overwrite Unit version
17435 uint8 FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const;
17436 uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const;
17437 uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const;
17438 [[nodiscard]] Item* GetItemByGuid(ObjectGuid guid) const;
17439 [[nodiscard]] Item* GetItemByEntry(uint32 entry) const;
17440 [[nodiscard]] Item* GetItemByPos(uint16 pos) const;
17441 [[nodiscard]] Item* GetItemByPos(uint8 bag, uint8 slot) const;
17442 [[nodiscard]] Bag* GetBagByPos(uint8 slot) const;
17443 [[nodiscard]] uint32 GetFreeInventorySpace() const;
17444 [[nodiscard]] inline Item* GetUseableItemByPos(uint8 bag, uint8 slot) const //Does additional check for disarmed weapons
17445 {
17447 return nullptr;
17448 return GetItemByPos(bag, slot);
17449 }
17450 [[nodiscard]] Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const;
17451 bool HasWeapon(WeaponAttackType type) const override { return GetWeaponForAttack(type, false); }
17452 bool HasWeaponForAttack(WeaponAttackType type) const override { return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); }
17453 [[nodiscard]] Item* GetShield(bool useable = false) const;
17454 static uint8 GetAttackBySlot(uint8 slot); // MAX_ATTACK if not weapon slot
17455 std::vector<Item*>& GetItemUpdateQueue() { return m_itemUpdateQueue; }
17456 static bool IsInventoryPos(uint16 pos) { return IsInventoryPos(pos >> 8, pos & 255); }
17457 static bool IsInventoryPos(uint8 bag, uint8 slot);
17458 static bool IsEquipmentPos(uint16 pos) { return IsEquipmentPos(pos >> 8, pos & 255); }
17459 static bool IsEquipmentPos(uint8 bag, uint8 slot);
17460 static bool IsBagPos(uint16 pos);
17461 static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); }
17462 static bool IsBankPos(uint8 bag, uint8 slot);
17463 bool IsValidPos(uint16 pos, bool explicit_pos) { return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
17464 bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos);
17465 [[nodiscard]] uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_2, 2); }
17466 void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, 2, count); }
17467 [[nodiscard]] bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const;
17468 bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const;
17469 bool CanNoReagentCast(SpellInfo const* spellInfo) const;
17470 [[nodiscard]] bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot = NULL_SLOT) const;
17471 [[nodiscard]] bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot = NULL_SLOT) const;
17472 InventoryResult CanTakeMoreSimilarItems(Item* pItem) const { return CanTakeMoreSimilarItems(pItem->GetEntry(), pItem->GetCount(), pItem); }
17473 [[nodiscard]] InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return CanTakeMoreSimilarItems(entry, count, nullptr); }
17474 InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = nullptr) const
17475 {
17476 return CanStoreItem(bag, slot, dest, item, count, nullptr, false, no_space_count);
17477 }
17478 InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap = false) const
17479 {
17480 if (!pItem)
17482 uint32 count = pItem->GetCount();
17483 return CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, nullptr);
17484 }
17485 InventoryResult CanStoreItems(Item** pItem, int32 count) const;
17486 InventoryResult CanEquipNewItem(uint8 slot, uint16& dest, uint32 item, bool swap) const;
17487 InventoryResult CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool swap, bool not_loading = true) const;
17488
17489 InventoryResult CanEquipUniqueItem(Item* pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const;
17490 InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const;
17491 [[nodiscard]] InventoryResult CanUnequipItems(uint32 item, uint32 count) const;
17492 [[nodiscard]] InventoryResult CanUnequipItem(uint16 src, bool swap) const;
17493 InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading = true) const;
17494 InventoryResult CanUseItem(Item* pItem, bool not_loading = true) const;
17495 [[nodiscard]] bool HasItemTotemCategory(uint32 TotemCategory) const;
17496 bool IsTotemCategoryCompatiableWith(ItemTemplate const* pProto, uint32 requiredTotemCategoryId) const;
17497 InventoryResult CanUseItem(ItemTemplate const* pItem) const;
17498 [[nodiscard]] InventoryResult CanUseAmmo(uint32 item) const;
17499 InventoryResult CanRollForItemInLFG(ItemTemplate const* item, WorldObject const* lootedObject) const;
17500 Item* StoreNewItem(ItemPosCountVec const& pos, uint32 item, bool update, int32 randomPropertyId = 0);
17501 Item* StoreNewItem(ItemPosCountVec const& pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet& allowedLooters);
17502 Item* StoreItem(ItemPosCountVec const& pos, Item* pItem, bool update);
17503 Item* EquipNewItem(uint16 pos, uint32 item, bool update);
17504 Item* EquipItem(uint16 pos, Item* pItem, bool update);
17505 void AutoUnequipOffhandIfNeed(bool force = false);
17506 bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count);
17507 void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast = false);
17508 void AutoStoreLoot(uint32 loot_id, LootStore const& store, bool broadcast = false) { AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
17509 LootItem* StoreLootItem(uint8 lootSlot, Loot* loot, InventoryResult& msg);
17510 void UpdateLootAchievements(LootItem* item, Loot* loot);
17511 void UpdateTitansGrip();
17512
17513 InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = nullptr) const;
17514 InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item* pItem = nullptr, bool swap = false, uint32* no_space_count = nullptr) const;
17515
17516 void AddRefundReference(ObjectGuid itemGUID);
17517 void DeleteRefundReference(ObjectGuid itemGUID);
17518
17519 void ApplyEquipCooldown(Item* pItem);
17520 void SetAmmo(uint32 item);
17521 void RemoveAmmo();
17522 [[nodiscard]] float GetAmmoDPS() const { return m_ammoDPS; }
17523 bool CheckAmmoCompatibility(ItemTemplate const* ammo_proto) const;
17524 void QuickEquipItem(uint16 pos, Item* pItem);
17525 void VisualizeItem(uint8 slot, Item* pItem);
17526 void SetVisibleItemSlot(uint8 slot, Item* pItem);
17527 Item* BankItem(ItemPosCountVec const& dest, Item* pItem, bool update)
17528 {
17529 return StoreItem(dest, pItem, update);
17530 }
17531 Item* BankItem(uint16 pos, Item* pItem, bool update);
17532 void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap = false);
17533 void MoveItemFromInventory(uint8 bag, uint8 slot, bool update);
17534 // in trade, auction, guild bank, mail....
17535 void MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool update, bool in_characterInventoryDB = false);
17536 // in trade, guild bank, mail....
17538 void DestroyItem(uint8 bag, uint8 slot, bool update);
17539 void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check = false);
17540 void DestroyItemCount(Item* item, uint32& count, bool update);
17541 void DestroyConjuredItems(bool update);
17542 void DestroyZoneLimitedItem(bool update, uint32 new_zone);
17543 void SplitItem(uint16 src, uint16 dst, uint32 count);
17544 void SwapItem(uint16 src, uint16 dst);
17545 void AddItemToBuyBackSlot(Item* pItem, uint32 money);
17547 void RemoveItemFromBuyBackSlot(uint32 slot, bool del);
17548 [[nodiscard]] uint32 GetMaxKeyringSize() const { return KEYRING_SLOT_END - KEYRING_SLOT_START; }
17549 void SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2 = nullptr, uint32 itemid = 0);
17550 void SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param);
17551 void SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param);
17552 void AddWeaponProficiency(uint32 newflag) { m_WeaponProficiency |= newflag; }
17553 void AddArmorProficiency(uint32 newflag) { m_ArmorProficiency |= newflag; }
17554 [[nodiscard]] uint32 GetWeaponProficiency() const { return m_WeaponProficiency; }
17555 [[nodiscard]] uint32 GetArmorProficiency() const { return m_ArmorProficiency; }
17556
17557 [[nodiscard]] bool IsTwoHandUsed() const
17558 {
17560 return mainItem && mainItem->GetTemplate()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip();
17561 }
17562 void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false, bool sendChatMessage = true);
17563 bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot);
17564 bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore);
17565
17566 [[nodiscard]] float GetReputationPriceDiscount(Creature const* creature) const;
17567 [[nodiscard]] float GetReputationPriceDiscount(FactionTemplateEntry const* factionTemplate) const;
17568
17569 [[nodiscard]] Player* GetTrader() const { return m_trade ? m_trade->GetTrader() : nullptr; }
17570 [[nodiscard]] TradeData* GetTradeData() const { return m_trade; }
17571 void TradeCancel(bool sendback);
17572
17573 CinematicMgr* GetCinematicMgr() const { return _cinematicMgr; }
17574
17575 void UpdateEnchantTime(uint32 time);
17577 void AddTradeableItem(Item* item);
17578 void RemoveTradeableItem(Item* item);
17579 void UpdateItemDuration(uint32 time, bool realtimeonly = false);
17580 void AddEnchantmentDurations(Item* item);
17581 void RemoveEnchantmentDurations(Item* item);
17582 void RemoveEnchantmentDurationsReferences(Item* item); // pussywizard
17584 void AddEnchantmentDuration(Item* item, EnchantmentSlot slot, uint32 duration);
17585 void ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool apply_dur = true, bool ignore_condition = false);
17586 void ApplyEnchantment(Item* item, bool apply);
17587 void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value);
17591 void AddItemDurations(Item* item);
17592 void RemoveItemDurations(Item* item);
17593 void SendItemDurations();
17594 void LoadCorpse(PreparedQueryResult result);
17595 void LoadPet();
17596
17597 bool AddItem(uint32 itemId, uint32 count);
17598
17599 /*********************************************************/
17600 /*** GOSSIP SYSTEM ***/
17601 /*********************************************************/
17602
17603 void PrepareGossipMenu(WorldObject* source, uint32 menuId = 0, bool showQuests = false);
17604 void SendPreparedGossip(WorldObject* source);
17605 void OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId);
17606
17607 uint32 GetGossipTextId(uint32 menuId, WorldObject* source);
17610
17611 void ToggleInstantFlight();
17612
17613 /*********************************************************/
17614 /*** QUEST SYSTEM ***/
17615 /*********************************************************/
17616
17617 int32 GetQuestLevel(Quest const* quest) const { return quest && (quest->GetQuestLevel() > 0) ? quest->GetQuestLevel() : GetLevel(); }
17618
17619 void PrepareQuestMenu(ObjectGuid guid);
17620 void SendPreparedQuest(ObjectGuid guid);
17621 [[nodiscard]] bool IsActiveQuest(uint32 quest_id) const;
17622 Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest);
17623 bool CanSeeStartQuest(Quest const* quest);
17624 bool CanTakeQuest(Quest const* quest, bool msg);
17625 bool CanAddQuest(Quest const* quest, bool msg);
17626 bool CanCompleteQuest(uint32 quest_id, const QuestStatusData* q_savedStatus = nullptr);
17627 bool CanCompleteRepeatableQuest(Quest const* quest);
17628 bool CanRewardQuest(Quest const* quest, bool msg);
17629 bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg);
17630 void AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver);
17631 void AddQuest(Quest const* quest, Object* questGiver);
17632 void AbandonQuest(uint32 quest_id);
17633 void CompleteQuest(uint32 quest_id);
17634 void IncompleteQuest(uint32 quest_id);
17635 void RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce = true, bool isLFGReward = false);
17636 void SetRewardedQuest(uint32 quest_id);
17637 void FailQuest(uint32 quest_id);
17638 bool SatisfyQuestSkill(Quest const* qInfo, bool msg) const;
17639 bool SatisfyQuestLevel(Quest const* qInfo, bool msg) const;
17640 bool SatisfyQuestLog(bool msg);
17641 bool SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) const;
17642 bool SatisfyQuestClass(Quest const* qInfo, bool msg) const;
17643 bool SatisfyQuestRace(Quest const* qInfo, bool msg) const;
17644 bool SatisfyQuestReputation(Quest const* qInfo, bool msg) const;
17645 bool SatisfyQuestStatus(Quest const* qInfo, bool msg) const;
17646 bool SatisfyQuestConditions(Quest const* qInfo, bool msg);
17647 bool SatisfyQuestTimed(Quest const* qInfo, bool msg) const;
17648 bool SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) const;
17649 bool SatisfyQuestNextChain(Quest const* qInfo, bool msg) const;
17650 bool SatisfyQuestPrevChain(Quest const* qInfo, bool msg) const;
17651 bool SatisfyQuestDay(Quest const* qInfo, bool msg) const;
17652 bool SatisfyQuestWeek(Quest const* qInfo, bool msg) const;
17653 bool SatisfyQuestMonth(Quest const* qInfo, bool msg) const;
17654 bool SatisfyQuestSeasonal(Quest const* qInfo, bool msg) const;
17655 bool GiveQuestSourceItem(Quest const* quest);
17656 bool TakeQuestSourceItem(uint32 questId, bool msg);
17657 uint32 CalculateQuestRewardXP(Quest const* quest);
17658 [[nodiscard]] bool GetQuestRewardStatus(uint32 quest_id) const;
17659 [[nodiscard]] QuestStatus GetQuestStatus(uint32 quest_id) const;
17660 void SetQuestStatus(uint32 questId, QuestStatus status, bool update = true);
17661 void RemoveActiveQuest(uint32 questId, bool update = true);
17662 void RemoveRewardedQuest(uint32 questId, bool update = true);
17663 void SendQuestUpdate(uint32 questId);
17665 float GetQuestRate(bool isDFQuest = false);
17666 void SetDailyQuestStatus(uint32 quest_id);
17667 bool IsDailyQuestDone(uint32 quest_id);
17668 void SetWeeklyQuestStatus(uint32 quest_id);
17669 void SetMonthlyQuestStatus(uint32 quest_id);
17670 void SetSeasonalQuestStatus(uint32 quest_id);
17671 void ResetDailyQuestStatus();
17674 void ResetSeasonalQuestStatus(uint16 event_id);
17675
17676 [[nodiscard]] uint16 FindQuestSlot(uint32 quest_id) const;
17679 [[nodiscard]] uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const { return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
17681 void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0)
17682 {
17688 }
17689 void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
17690 {
17692 val &= ~((uint64)0xFFFF << (counter * 16));
17693 val |= ((uint64)count << (counter * 16));
17695 }
17699 void SwapQuestSlot(uint16 slot1, uint16 slot2)
17700 {
17701 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
17702 {
17705
17708 }
17709 }
17711 void AreaExploredOrEventHappens(uint32 questId);
17712 void GroupEventHappens(uint32 questId, WorldObject const* pEventObject);
17713 void ItemAddedQuestCheck(uint32 entry, uint32 count);
17714 void ItemRemovedQuestCheck(uint32 entry, uint32 count);
17715 void KilledMonster(CreatureTemplate const* cInfo, ObjectGuid guid);
17717 void KilledPlayerCredit(uint16 count = 1);
17718 void KilledPlayerCreditForQuest(uint16 count, Quest const* quest);
17719 void KillCreditGO(uint32 entry, ObjectGuid guid = ObjectGuid::Empty);
17720 void TalkedToCreature(uint32 entry, ObjectGuid guid);
17721 void MoneyChanged(uint32 value);
17722 void ReputationChanged(FactionEntry const* factionEntry);
17723 void ReputationChanged2(FactionEntry const* factionEntry);
17724 [[nodiscard]] bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId = 0, bool turnIn = false, bool* showInLoot = nullptr) const;
17725 [[nodiscard]] bool HasQuestForGO(int32 GOId) const;
17726 [[nodiscard]] bool HasQuest(uint32 questId) const;
17728 [[nodiscard]] bool CanShareQuest(uint32 quest_id) const;
17729
17730 void SendQuestComplete(uint32 quest_id);
17731 void SendQuestReward(Quest const* quest, uint32 XP);
17732 void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK);
17733 void SendQuestTimerFailed(uint32 quest_id);
17734 void SendCanTakeQuestResponse(uint32 msg) const;
17735 void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver);
17736 void SendPushToPartyResponse(Player const* player, uint8 msg) const;
17737 void SendQuestUpdateAddItem(Quest const* quest, uint32 item_idx, uint16 count);
17738 void SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count);
17739 void SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint16 add_count);
17740
17741 ObjectGuid GetDivider() { return m_divider; }
17742 void SetDivider(ObjectGuid guid = ObjectGuid::Empty) { m_divider = guid; }
17743
17744 uint32 GetInGameTime() { return m_ingametime; }
17745
17746 void SetInGameTime(uint32 time) { m_ingametime = time; }
17747
17748 void AddTimedQuest(uint32 quest_id) { m_timedquests.insert(quest_id); }
17749 void RemoveTimedQuest(uint32 quest_id) { m_timedquests.erase(quest_id); }
17750
17751 [[nodiscard]] bool HasPvPForcingQuest() const;
17752
17753 /*********************************************************/
17754 /*** LOAD SYSTEM ***/
17755 /*********************************************************/
17756
17757 bool LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& holder);
17758 [[nodiscard]] bool isBeingLoaded() const override;
17759
17761 static uint32 GetZoneIdFromDB(ObjectGuid guid);
17762 static bool LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, ObjectGuid::LowType guid);
17763
17764 static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; }
17765
17766 /*********************************************************/
17767 /*** SAVE SYSTEM ***/
17768 /*********************************************************/
17769
17770 void SaveToDB(bool create, bool logout);
17771 void SaveToDB(CharacterDatabaseTransaction trans, bool create, bool logout);
17772 void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans); // fast save function for item/money cheating preventing
17775
17776 static void Customize(CharacterCustomizeInfo const* customizeInfo, CharacterDatabaseTransaction trans);
17777 static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid);
17778 static void SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans);
17779
17780 static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally);
17781 static void DeleteOldCharacters();
17782 static void DeleteOldCharacters(uint32 keepDays);
17783
17784 static void DeleteOldRecoveryItems();
17785 static void DeleteOldRecoveryItems(uint32 keepDays);
17786
17787 bool m_mailsUpdated;
17788
17789 void SetBindPoint(ObjectGuid guid);
17791 void ResetPetTalents();
17792 void CalcRage(uint32 damage, bool attacker);
17793 void RegenerateAll();
17794 void Regenerate(Powers power);
17795 void RegenerateHealth();
17796 void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;}
17798
17799 [[nodiscard]] uint32 GetMoney() const { return GetUInt32Value(PLAYER_FIELD_COINAGE); }
17800 bool ModifyMoney(int32 amount, bool sendError = true);
17801 [[nodiscard]] bool HasEnoughMoney(uint32 amount) const { return (GetMoney() >= amount); }
17802 [[nodiscard]] bool HasEnoughMoney(int32 amount) const
17803 {
17804 if (amount > 0)
17805 return (GetMoney() >= (uint32) amount);
17806 return true;
17807 }
17808
17809 void SetMoney(uint32 value)
17810 {
17812 MoneyChanged(value);
17814 }
17815
17816 [[nodiscard]] RewardedQuestSet const& getRewardedQuests() const { return m_RewardedQuests; }
17819
17820 [[nodiscard]] std::size_t GetRewardedQuestCount() const { return m_RewardedQuests.size(); }
17821 [[nodiscard]] bool IsQuestRewarded(uint32 quest_id) const
17822 {
17823 return m_RewardedQuests.find(quest_id) != m_RewardedQuests.end();
17824 }
17825
17826 [[nodiscard]] Unit* GetSelectedUnit() const;
17827 [[nodiscard]] Player* GetSelectedPlayer() const;
17828
17829 void SetTarget(ObjectGuid /*guid*/ = ObjectGuid::Empty) override { }
17830 void SetSelection(ObjectGuid guid);
17831
17832 void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType item_guid = 0, uint32 item_count = 0);
17833 void SendNewMail();
17835 void AddNewMailDeliverTime(time_t deliver_time);
17836
17837 void RemoveMail(uint32 id);
17838
17839 void AddMail(Mail* mail) { m_mail.push_front(mail); }// for call from WorldSession::SendMailTo
17840 uint32 GetMailSize() { return m_mail.size();}
17841 Mail* GetMail(uint32 id);
17842
17843 [[nodiscard]] PlayerMails const& GetMails() const { return m_mail; }
17844 void SendItemRetrievalMail(uint32 itemEntry, uint32 count); // Item retrieval mails sent by The Postmaster (34337)
17845 void SendItemRetrievalMail(std::vector<std::pair<uint32, uint32>> mailItems); // Item retrieval mails sent by The Postmaster (34337)
17846
17847 /*********************************************************/
17848 /*** MAILED ITEMS SYSTEM ***/
17849 /*********************************************************/
17850
17853
17854 typedef std::unordered_map<ObjectGuid::LowType, Item*> ItemMap;
17855
17856 ItemMap mMitems; //template defined in objectmgr.cpp
17857
17858 Item* GetMItem(ObjectGuid::LowType itemLowGuid)
17859 {
17860 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
17861 return itr != mMitems.end() ? itr->second : nullptr;
17862 }
17863
17864 void AddMItem(Item* it)
17865 {
17866 ASSERT(it);
17867 //ASSERT deleted, because items can be added before loading
17868 mMitems[it->GetGUID().GetCounter()] = it;
17869 }
17870
17871 bool RemoveMItem(ObjectGuid::LowType itemLowGuid)
17872 {
17873 return !!mMitems.erase(itemLowGuid);
17874 }
17875
17876 void PetSpellInitialize();
17877 void CharmSpellInitialize();
17880 void SendRemoveControlBar();
17881 [[nodiscard]] bool HasSpell(uint32 spell) const override;
17882 [[nodiscard]] bool HasActiveSpell(uint32 spell) const; // show in spellbook
17883 TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const;
17884 [[nodiscard]] bool IsSpellFitByClassAndRace(uint32 spell_id) const;
17885 bool IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const;
17886
17887 void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask);
17888 void SendInitialSpells();
17889 void SendLearnPacket(uint32 spellId, bool learn);
17890 bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary = false, bool learnFromSkill = false);
17891 bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill = false);
17892 void learnSpell(uint32 spellId, bool temporary = false, bool learnFromSkill = false);
17893 void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary);
17894 void resetSpells();
17895 void LearnCustomSpells();
17896 void LearnDefaultSkills();
17897 void LearnDefaultSkill(uint32 skillId, uint16 rank);
17899 void learnQuestRewardedSpells(Quest const* quest);
17900 void learnSpellHighRank(uint32 spellid);
17901 void SetReputation(uint32 factionentry, float value);
17902 [[nodiscard]] uint32 GetReputation(uint32 factionentry) const;
17903 std::string const& GetGuildName();
17904 [[nodiscard]] uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); }
17905 void SetFreeTalentPoints(uint32 points);
17906 bool resetTalents(bool noResetCost = false);
17907 [[nodiscard]] uint32 resetTalentsCost() const;
17908 bool IsMaxLevel() const;
17909 void InitTalentForLevel();
17912 void SendTalentsInfoData(bool pet);
17913 void LearnTalent(uint32 talentId, uint32 talentRank, bool command = false);
17914 void LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRank);
17915
17916 bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank);
17917 void _removeTalent(PlayerTalentMap::iterator& itr, uint8 specMask);
17918 void _removeTalent(uint32 spellId, uint8 specMask);
17919 void _removeTalentAurasAndSpells(uint32 spellId);
17920 void _addTalentAurasAndSpells(uint32 spellId);
17921 [[nodiscard]] bool HasTalent(uint32 spell_id, uint8 spec) const;
17922
17923 [[nodiscard]] uint32 CalculateTalentsPoints() const;
17924 void SetBonusTalentCount(uint32 count) { m_extraBonusTalentCount = count; };
17926 void AddBonusTalent(uint32 count) { m_extraBonusTalentCount += count; };
17927 void RemoveBonusTalent(uint32 count) { m_extraBonusTalentCount -= count; };
17928
17929 // Dual Spec
17930 void UpdateSpecCount(uint8 count);
17931 [[nodiscard]] uint8 GetActiveSpec() const { return m_activeSpec; }
17932 [[nodiscard]] uint8 GetActiveSpecMask() const { return (1 << m_activeSpec); }
17933 void SetActiveSpec(uint8 spec) { m_activeSpec = spec; }
17934 [[nodiscard]] uint8 GetSpecsCount() const { return m_specsCount; }
17935 void SetSpecsCount(uint8 count) { m_specsCount = count; }
17936 void ActivateSpec(uint8 spec);
17937 void LoadActions(PreparedQueryResult result);
17938 void GetTalentTreePoints(uint8 (&specPoints)[3]) const;
17939 [[nodiscard]] uint8 GetMostPointsTalentTree() const;
17940 bool HasTankSpec();
17941 bool HasMeleeSpec();
17942 bool HasCasterSpec();
17943 bool HasHealSpec();
17944 uint32 GetSpec(int8 spec = -1);
17945
17946 void InitGlyphsForLevel();
17947 void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
17948 [[nodiscard]] uint32 GetGlyphSlot(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
17949 void SetGlyph(uint8 slot, uint32 glyph, bool save)
17950 {
17951 m_Glyphs[m_activeSpec][slot] = glyph;
17953
17954 if (save)
17955 SetNeedToSaveGlyphs(true);
17956 }
17957 [[nodiscard]] uint32 GetGlyph(uint8 slot) const { return m_Glyphs[m_activeSpec][slot]; }
17958
17962
17963 [[nodiscard]] PlayerSpellMap const& GetSpellMap() const { return m_spells; }
17964 PlayerSpellMap& GetSpellMap() { return m_spells; }
17965
17966 [[nodiscard]] SpellCooldowns const& GetSpellCooldownMap() const { return m_spellCooldowns; }
17968
17969 SkillStatusMap const& GetSkillStatusMap() const { return mSkillStatus; }
17971
17972 void AddSpellMod(SpellModifier* mod, bool apply);
17973 bool IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell = nullptr);
17974 bool HasSpellMod(SpellModifier* mod, Spell* spell);
17975 template <class T>
17976 void ApplySpellMod(uint32 spellId, SpellModOp op, T& basevalue, Spell* spell = nullptr, bool temporaryPet = false);
17977 void RemoveSpellMods(Spell* spell);
17978 void RestoreSpellMods(Spell* spell, uint32 ownerAuraId = 0, Aura* aura = nullptr);
17979 void RestoreAllSpellMods(uint32 ownerAuraId = 0, Aura* aura = nullptr);
17980 void DropModCharge(SpellModifier* mod, Spell* spell);
17981 void SetSpellModTakingSpell(Spell* spell, bool apply);
17982
17983 [[nodiscard]] bool HasSpellCooldown(uint32 spell_id) const override;
17984 [[nodiscard]] bool HasSpellItemCooldown(uint32 spell_id, uint32 itemid) const override;
17985 [[nodiscard]] uint32 GetSpellCooldownDelay(uint32 spell_id) const;
17986 void AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 itemId, Spell* spell = nullptr, bool infinityCooldown = false);
17987 void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient = false, bool forceSendToSpectator = false) override;
17988 void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient = false, bool forceSendToSpectator = false);
17989 void ModifySpellCooldown(uint32 spellId, int32 cooldown);
17990 void SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId = 0, Spell* spell = nullptr, bool setCooldown = true);
17991 void ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) override;
17992 void RemoveSpellCooldown(uint32 spell_id, bool update = false);
17993 void SendClearCooldown(uint32 spell_id, Unit* target);
17994
17996
17998 void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns = false);
18001 void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout);
18003 void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
18004 void UpdatePotionCooldown(Spell* spell = nullptr);
18005
18006 void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
18007 {
18008 m_resurrectGUID = guid;
18009 m_resurrectMap = mapId;
18010 m_resurrectX = X;
18011 m_resurrectY = Y;
18012 m_resurrectZ = Z;
18013 m_resurrectHealth = health;
18014 m_resurrectMana = mana;
18015 }
18016 void clearResurrectRequestData() { setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
18017 [[nodiscard]] bool isResurrectRequestedBy(ObjectGuid guid) const { return m_resurrectGUID && m_resurrectGUID == guid; }
18018 [[nodiscard]] bool isResurrectRequested() const { return m_resurrectGUID; }
18020
18021 [[nodiscard]] uint8 getCinematic() const
18022 {
18023 return m_cinematic;
18024 }
18025 void setCinematic(uint8 cine)
18026 {
18027 m_cinematic = cine;
18028 }
18029
18030 ActionButton* addActionButton(uint8 button, uint32 action, uint8 type);
18031 void removeActionButton(uint8 button);
18032 ActionButton const* GetActionButton(uint8 button);
18033 void SendInitialActionButtons() const { SendActionButtons(1); }
18034 void SendActionButtons(uint32 state) const;
18035 bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type);
18036
18038 void UpdatePvPState();
18039 void UpdateFFAPvPState(bool reset = true);
18040 void SetPvP(bool state)
18041 {
18042 Unit::SetPvP(state);
18043 if (!m_Controlled.empty())
18044 for (auto& itr : m_Controlled)
18045 itr->SetPvP(state);
18046 }
18047 void UpdatePvP(bool state, bool _override = false);
18048 void UpdateZone(uint32 newZone, uint32 newArea);
18049 void UpdateArea(uint32 newArea);
18050 void SetNeedZoneUpdate(bool needUpdate) { m_needZoneUpdate = needUpdate; }
18051
18052 void UpdateZoneDependentAuras(uint32 zone_id); // zones
18053 void UpdateAreaDependentAuras(uint32 area_id); // subzones
18054
18055 void UpdateAfkReport(time_t currTime);
18056 void UpdatePvPFlag(time_t currTime);
18057 void UpdateFFAPvPFlag(time_t currTime);
18058 void UpdateContestedPvP(uint32 currTime);
18059 void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;}
18060 void ResetContestedPvP()
18061 {
18065 }
18066
18068 std::unique_ptr<DuelInfo> duel;
18069 void UpdateDuelFlag(time_t currTime);
18070 void CheckDuelDistance(time_t currTime);
18071 void DuelComplete(DuelCompleteType type);
18072 void SendDuelCountdown(uint32 counter);
18073
18074 bool IsGroupVisibleFor(Player const* p) const;
18075 bool IsInSameGroupWith(Player const* p) const;
18076 bool IsInSameRaidWith(Player const* p) const { return p == this || (GetGroup() != nullptr && GetGroup() == p->GetGroup()); }
18077 void UninviteFromGroup();
18078 static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = nullptr);
18081
18082 void SetInGuild(uint32 GuildId)
18083 {
18085 // xinef: update global storage
18086 sCharacterCache->UpdateCharacterGuildId(GetGUID(), GetGuildId());
18087 }
18088 void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); }
18089 [[nodiscard]] uint8 GetRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); }
18090 void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
18091 [[nodiscard]] uint32 GetGuildId() const { return GetUInt32Value(PLAYER_GUILDID); }
18092 [[nodiscard]] Guild* GetGuild() const;
18094 static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type);
18095
18096 // Arena Team
18097 void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
18098 {
18099 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
18101 }
18102 void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value);
18103 [[nodiscard]] uint32 GetArenaPersonalRating(uint8 slot) const;
18104 static uint32 GetArenaTeamIdFromDB(ObjectGuid guid, uint8 slot);
18105 static void LeaveAllArenaTeams(ObjectGuid guid);
18106 [[nodiscard]] uint32 GetArenaTeamId(uint8 slot) const;
18107 void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
18109
18110 [[nodiscard]] Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; }
18111 [[nodiscard]] Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; }
18112 [[nodiscard]] Difficulty GetRaidDifficulty() const { return m_raidDifficulty; }
18113 [[nodiscard]] Difficulty GetStoredRaidDifficulty() const { return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map
18114 void SetDungeonDifficulty(Difficulty dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
18115 void SetRaidDifficulty(Difficulty raid_difficulty) { m_raidDifficulty = raid_difficulty; }
18117
18118 bool UpdateSkill(uint32 skill_id, uint32 step);
18119 bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step);
18120
18121 bool UpdateCraftSkill(uint32 spellid);
18122 bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1);
18123 bool UpdateFishingSkill();
18124
18125 [[nodiscard]] uint32 GetBaseDefenseSkillValue() const { return GetBaseSkillValue(SKILL_DEFENSE); }
18126 [[nodiscard]] uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const;
18127
18129
18132
18133 bool UpdateStats(Stats stat) override;
18134 bool UpdateAllStats() override;
18135 void ApplySpellPenetrationBonus(int32 amount, bool apply);
18136 void UpdateResistances(uint32 school) override;
18137 void UpdateArmor() override;
18138 void UpdateMaxHealth() override;
18139 void UpdateMaxPower(Powers power) override;
18140 void ApplyFeralAPBonus(int32 amount, bool apply);
18141 void UpdateAttackPowerAndDamage(bool ranged = false) override;
18143 void ApplySpellPowerBonus(int32 amount, bool apply);
18145 void ApplyRatingMod(CombatRating cr, int32 value, bool apply);
18146 void UpdateRating(CombatRating cr);
18147 void UpdateAllRatings();
18148
18149 void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) override;
18150
18152 inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);}
18154 void GetDodgeFromAgility(float& diminishing, float& nondiminishing);
18155 [[nodiscard]] float GetMissPercentageFromDefence() const;
18157 float OCTRegenHPPerSpirit();
18158 float OCTRegenMPPerSpirit();
18159 [[nodiscard]] float GetRatingMultiplier(CombatRating cr) const;
18160 [[nodiscard]] float GetRatingBonusValue(CombatRating cr) const;
18162 [[nodiscard]] int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; }
18163
18164 [[nodiscard]] float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const;
18165 void UpdateBlockPercentage();
18168 void UpdateParryPercentage();
18169 void UpdateDodgePercentage();
18170 void UpdateMeleeHitChances();
18172 void UpdateSpellHitChances();
18173
18175 void UpdateSpellCritChance(uint32 school);
18176 void UpdateArmorPenetration(int32 amount);
18177 void UpdateExpertise(WeaponAttackType attType);
18178 void ApplyManaRegenBonus(int32 amount, bool apply);
18179 void ApplyHealthRegenBonus(int32 amount, bool apply);
18180 void UpdateManaRegen();
18181 void UpdateRuneRegen(RuneType rune);
18182
18183 [[nodiscard]] ObjectGuid GetLootGUID() const { return m_lootGuid; }
18184 void SetLootGUID(ObjectGuid guid) { m_lootGuid = guid; }
18185
18186 void RemovedInsignia(Player* looterPlr);
18187
18188 [[nodiscard]] WorldSession* GetSession() const { return m_session; }
18189 void SetSession(WorldSession* sess) { m_session = sess; }
18190
18191 void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) override;
18192 void DestroyForPlayer(Player* target, bool onDeath = false) const override;
18193 void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate = 1.0f);
18194
18195 // notifiers
18201 void SendAutoRepeatCancel(Unit* target);
18202 void SendExplorationExperience(uint32 Area, uint32 Experience);
18203
18204 void SendDungeonDifficulty(bool IsInGroup);
18205 void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty = -1);
18206 static void ResetInstances(ObjectGuid guid, uint8 method, bool isRaid);
18207 void SendResetInstanceSuccess(uint32 MapId);
18208 void SendResetInstanceFailed(uint32 reason, uint32 MapId);
18209 void SendResetFailedNotify(uint32 mapid);
18210
18211 bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override;
18212 bool UpdatePosition(const Position& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
18213
18214 void ProcessTerrainStatusUpdate() override;
18215
18216 void SendMessageToSet(WorldPacket const* data, bool self) const override;
18217 void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) const override;
18218 void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist = false) const;
18219 void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const override;
18220 void SendTeleportAckPacket();
18221
18222 [[nodiscard]] Corpse* GetCorpse() const;
18223 void SpawnCorpseBones(bool triggerSave = true);
18225 void RemoveCorpse();
18226 void KillPlayer();
18227 static void OfflineResurrect(ObjectGuid const guid, CharacterDatabaseTransaction trans);
18228 [[nodiscard]] bool HasCorpse() const { return _corpseLocation.GetMapId() != MAPID_INVALID; }
18229 [[nodiscard]] WorldLocation GetCorpseLocation() const { return _corpseLocation; }
18231 void ResurrectPlayer(float restore_percent, bool applySickness = false);
18232 void BuildPlayerRepop();
18233 void RepopAtGraveyard();
18234
18235 void SendDurabilityLoss();
18236 void DurabilityLossAll(double percent, bool inventory);
18237 void DurabilityLoss(Item* item, double percent);
18238 void DurabilityPointsLossAll(int32 points, bool inventory);
18239 void DurabilityPointsLoss(Item* item, int32 points);
18241 uint32 DurabilityRepairAll(bool cost, float discountMod, bool guildBank);
18242 uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank);
18243
18244 void UpdateMirrorTimers();
18245 void StopMirrorTimers()
18246 {
18250 }
18251 bool IsMirrorTimerActive(MirrorTimerType type) { return m_MirrorTimer[type] == getMaxTimer(type); }
18252
18253 void SetMovement(PlayerMovementType pType);
18254
18255 bool CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone);
18256
18257 void JoinedChannel(Channel* c);
18258 void LeftChannel(Channel* c);
18259 void CleanupChannels();
18260 void ClearChannelWatch();
18261 void UpdateLFGChannel();
18262 void UpdateLocalChannels(uint32 newZone);
18263
18264 void UpdateDefense();
18265 void UpdateWeaponSkill(Unit* victim, WeaponAttackType attType, Item* item = nullptr);
18266 void UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence, Item* item = nullptr);
18267
18268 void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal);
18269 [[nodiscard]] uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
18270 [[nodiscard]] uint16 GetPureMaxSkillValue(uint32 skill) const; // max
18271 [[nodiscard]] uint16 GetSkillValue(uint32 skill) const; // skill value + perm. bonus + temp bonus
18272 [[nodiscard]] uint16 GetBaseSkillValue(uint32 skill) const; // skill value + perm. bonus
18273 [[nodiscard]] uint16 GetPureSkillValue(uint32 skill) const; // skill value
18274 [[nodiscard]] int16 GetSkillPermBonusValue(uint32 skill) const;
18275 [[nodiscard]] int16 GetSkillTempBonusValue(uint32 skill) const;
18276 [[nodiscard]] uint16 GetSkillStep(uint16 skill) const; // 0...6
18277 [[nodiscard]] bool HasSkill(uint32 skill) const;
18278 void learnSkillRewardedSpells(uint32 id, uint32 value);
18279
18281 [[nodiscard]] bool IsBeingTeleported() const { return mSemaphoreTeleport_Near != 0 || mSemaphoreTeleport_Far != 0; }
18282 [[nodiscard]] bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near != 0; }
18283 [[nodiscard]] bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far != 0; }
18284 void SetSemaphoreTeleportNear(time_t tm) { mSemaphoreTeleport_Near = tm; }
18285 void SetSemaphoreTeleportFar(time_t tm) { mSemaphoreTeleport_Far = tm; }
18286 [[nodiscard]] time_t GetSemaphoreTeleportNear() const { return mSemaphoreTeleport_Near; }
18287 [[nodiscard]] time_t GetSemaphoreTeleportFar() const { return mSemaphoreTeleport_Far; }
18289 [[nodiscard]] uint32 GetDelayedOperations() const { return m_DelayedOperations; }
18290 void ScheduleDelayedOperation(uint32 operation)
18291 {
18292 if (operation < DELAYED_END)
18293 m_DelayedOperations |= operation;
18294 }
18295
18297
18298 static TeamId TeamIdForRace(uint8 race);
18299 [[nodiscard]] TeamId GetTeamId(bool original = false) const { return original ? TeamIdForRace(getRace(true)) : m_team; };
18300 void SetFactionForRace(uint8 race);
18301 void setTeamId(TeamId teamid) { m_team = teamid; };
18302
18303 void InitDisplayIds();
18304
18305 bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
18306 bool IsAtLootRewardDistance(WorldObject const* pRewardSource) const;
18307 bool IsAtRecruitAFriendDistance(WorldObject const* pOther) const;
18308 void RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround);
18309 void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource);
18310 bool isHonorOrXPTarget(Unit* victim) const;
18311
18312 bool GetsRecruitAFriendBonus(bool forXP);
18314 void SetGrantableLevels(uint8 val) { m_grantableLevels = val; }
18315
18317 [[nodiscard]] ReputationMgr const& GetReputationMgr() const { return *m_reputationMgr; }
18318 [[nodiscard]] ReputationRank GetReputationRank(uint32 faction_id) const;
18319 void RewardReputation(Unit* victim);
18320 void RewardReputation(Quest const* quest);
18321
18322 float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus = false);
18323
18324 void UpdateSkillsForLevel();
18325 void UpdateSkillsToMaxSkillsForLevel(); // for .levelup
18326 void ModifySkillBonus(uint32 skillid, int32 val, bool talent);
18327
18336 void RewardExtraBonusTalentPoints(uint32 bonusTalentPoints);
18337
18338 /*********************************************************/
18339 /*** PVP SYSTEM ***/
18340 /*********************************************************/
18341 void UpdateHonorFields();
18342 bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, bool awardXP = true);
18343 [[nodiscard]] uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
18344 [[nodiscard]] uint32 GetArenaPoints() const { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
18347 [[nodiscard]] uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const;
18348 void SetHonorPoints(uint32 value);
18349 void SetArenaPoints(uint32 value);
18350
18351 // duel health and mana reset methods
18356
18357 //End of PvP System
18358
18359 [[nodiscard]] inline SpellCooldowns GetSpellCooldowns() const { return m_spellCooldowns; }
18360
18361 void SetDrunkValue(uint8 newDrunkValue, uint32 itemId = 0);
18362 [[nodiscard]] uint8 GetDrunkValue() const { return GetByteValue(PLAYER_BYTES_3, 1); }
18363 [[nodiscard]] int32 GetFakeDrunkValue() const { return GetInt32Value(PLAYER_FAKE_INEBRIATION); }
18366
18367 [[nodiscard]] uint32 GetDeathTimer() const { return m_deathTimer; }
18368 [[nodiscard]] uint32 GetCorpseReclaimDelay(bool pvp) const;
18370 int32 CalculateCorpseReclaimDelay(bool load = false);
18371 void SendCorpseReclaimDelay(uint32 delay);
18372
18373 [[nodiscard]] uint32 GetShieldBlockValue() const override; // overwrite Unit version (virtual)
18374 [[nodiscard]] bool CanParry() const { return m_canParry; }
18375 void SetCanParry(bool value);
18376 [[nodiscard]] bool CanBlock() const { return m_canBlock; }
18377 void SetCanBlock(bool value);
18378 [[nodiscard]] bool CanTitanGrip() const { return m_canTitanGrip; }
18379 void SetCanTitanGrip(bool value);
18380 [[nodiscard]] bool CanTameExoticPets() const { return IsGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); }
18381
18382 void SetRegularAttackTime();
18383 void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
18384 void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply);
18385 [[nodiscard]] float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const;
18386 [[nodiscard]] float GetTotalBaseModValue(BaseModGroup modGroup) const;
18387 [[nodiscard]] float GetTotalPercentageModValue(BaseModGroup modGroup) const { return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }
18388 void _ApplyAllStatBonuses();
18389 void _RemoveAllStatBonuses();
18390
18391 void ResetAllPowers();
18392
18393 SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK, uint8 damageIndex = 0) const override;
18394
18395 void _ApplyWeaponDependentAuraMods(Item* item, WeaponAttackType attackType, bool apply);
18396 void _ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply);
18397 void _ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply);
18398
18399 void _ApplyItemMods(Item* item, uint8 slot, bool apply);
18400 void _RemoveAllItemMods();
18401 void _ApplyAllItemMods();
18402 void _ApplyAllLevelScaleItemMods(bool apply);
18403 void _ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale = false);
18404 void _ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv, bool apply);
18405 void _ApplyAmmoBonuses();
18406 bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot);
18407 void ToggleMetaGemsActive(uint8 exceptslot, bool apply);
18408 void CorrectMetaGemEnchants(uint8 slot, bool apply);
18409 void InitDataForForm(bool reapplyMods = false);
18410
18411 void ApplyItemEquipSpell(Item* item, bool apply, bool form_change = false);
18412 void ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, bool form_change = false);
18414 void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx);
18415 void CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 cast_count, uint32 glyphIndex);
18416 void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto);
18417
18418 void SendEquipmentSetList();
18419 void SetEquipmentSet(uint32 index, EquipmentSet eqset);
18420 void DeleteEquipmentSet(uint64 setGuid);
18421
18422 void SendInitWorldStates(uint32 zone, uint32 area);
18423 void SendUpdateWorldState(uint32 variable, uint32 value) const;
18424 void SendDirectMessage(WorldPacket const* data) const;
18427
18428 void GetAurasForTarget(Unit* target, bool force = false);
18429
18431 std::vector<ItemSetEffect*> ItemSetEff;
18432
18433 void SendLoot(ObjectGuid guid, LootType loot_type);
18434 void SendLootError(ObjectGuid guid, LootError error);
18435 void SendLootRelease(ObjectGuid guid);
18436 void SendNotifyLootItemRemoved(uint8 lootSlot);
18438
18439 /*********************************************************/
18440 /*** BATTLEGROUND SYSTEM ***/
18441 /*********************************************************/
18442
18443 [[nodiscard]] bool InBattleground() const { return m_bgData.bgInstanceID != 0; }
18444 [[nodiscard]] bool InArena() const;
18445 [[nodiscard]] uint32 GetBattlegroundId() const { return m_bgData.bgInstanceID; }
18446 [[nodiscard]] BattlegroundTypeId GetBattlegroundTypeId() const { return m_bgData.bgTypeID; }
18447 [[nodiscard]] uint32 GetCurrentBattlegroundQueueSlot() const { return m_bgData.bgQueueSlot; }
18448 [[nodiscard]] bool IsInvitedForBattlegroundInstance() const { return m_bgData.isInvited; }
18449 [[nodiscard]] bool IsCurrentBattlegroundRandom() const { return m_bgData.bgIsRandom; }
18450 BGData& GetBGData() { return m_bgData; }
18451 void SetBGData(BGData& bgdata) { m_bgData = bgdata; }
18452 [[nodiscard]] Battleground* GetBattleground(bool create = false) const;
18453
18454 [[nodiscard]] bool InBattlegroundQueue(bool ignoreArena = false) const;
18455 [[nodiscard]] bool IsDeserter() const { return HasAura(26013); }
18456
18458 [[nodiscard]] uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const;
18459 [[nodiscard]] bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
18460 [[nodiscard]] bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
18461
18462 void SetBattlegroundId(uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId);
18464 bool HasFreeBattlegroundQueueId() const;
18467 bool IsInvitedForBattlegroundInstance(uint32 instanceId) const;
18468
18469 [[nodiscard]] TeamId GetBgTeamId() const { return m_bgData.bgTeamId != TEAM_NEUTRAL ? m_bgData.bgTeamId : GetTeamId(); }
18470
18471 void LeaveBattleground(Battleground* bg = nullptr);
18472 [[nodiscard]] bool CanJoinToBattleground() const;
18474 void ReportedAfkBy(Player* reporter);
18475 void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); }
18476
18477 [[nodiscard]] bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const;
18478 bool CanUseBattlegroundObject(GameObject* gameobject) const;
18479 [[nodiscard]] bool isTotalImmune() const;
18480 [[nodiscard]] bool CanCaptureTowerPoint() const;
18481
18482 bool GetRandomWinner() { return m_IsBGRandomWinner; }
18483 void SetRandomWinner(bool isWinner);
18484
18485 /*********************************************************/
18486 /*** OUTDOOR PVP SYSTEM ***/
18487 /*********************************************************/
18488
18489 [[nodiscard]] OutdoorPvP* GetOutdoorPvP() const;
18490 // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise
18491 bool IsOutdoorPvPActive();
18492
18493 /*********************************************************/
18494 /*** ENVIROMENTAL SYSTEM ***/
18495 /*********************************************************/
18496
18499
18500 /*********************************************************/
18501 /*** FLOOD FILTER SYSTEM ***/
18502 /*********************************************************/
18503
18504 struct ChatFloodThrottle
18505 {
18506 enum Index
18507 {
18508 REGULAR = 0,
18509 ADDON = 1,
18510 MAX
18511 };
18512
18513 time_t Time = 0;
18514 uint32 Count = 0;
18515 };
18516
18518 [[nodiscard]] bool CanSpeak() const;
18519
18520 /*********************************************************/
18521 /*** VARIOUS SYSTEMS ***/
18522 /*********************************************************/
18523 void UpdateFallInformationIfNeed(MovementInfo const& minfo, uint16 opcode);
18526 std::set<Unit*> m_isInSharedVisionOf;
18527 void SetFallInformation(uint32 time, float z)
18528 {
18529 m_lastFallTime = time;
18530 m_lastFallZ = z;
18531 }
18532 void HandleFall(MovementInfo const& movementInfo);
18533
18534 [[nodiscard]] bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell);
18535
18536 void SetClientControl(Unit* target, bool allowMove, bool packetOnly = false);
18537
18538 void SetMover(Unit* target);
18539
18540 void SetSeer(WorldObject* target) { m_seer = target; }
18541 void SetViewpoint(WorldObject* target, bool apply);
18542 [[nodiscard]] WorldObject* GetViewpoint() const;
18543 void StopCastingCharm(Aura* except = nullptr);
18544 void StopCastingBindSight(Aura* except = nullptr);
18545
18546 [[nodiscard]] uint32 GetSaveTimer() const { return m_nextSave; }
18547 void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
18548
18549 // Recall position
18551 float m_recallX;
18552 float m_recallY;
18553 float m_recallZ;
18554 float m_recallO;
18555 void SaveRecallPosition();
18556
18557 void SetHomebind(WorldLocation const& loc, uint32 areaId);
18558
18559 // Homebind coordinates
18562 float m_homebindX;
18563 float m_homebindY;
18564 float m_homebindZ;
18565
18566 [[nodiscard]] WorldLocation GetStartPosition() const;
18567
18568 [[nodiscard]] WorldLocation const& GetEntryPoint() const { return m_entryPointData.joinPos; }
18569 void SetEntryPoint();
18570
18571 // currently visible objects at player client
18573 std::vector<Unit*> m_newVisible; // pussywizard
18574
18575 [[nodiscard]] bool HaveAtClient(WorldObject const* u) const;
18576 [[nodiscard]] bool HaveAtClient(ObjectGuid guid) const;
18577
18578 [[nodiscard]] bool IsNeverVisible() const override;
18579
18580 bool IsVisibleGloballyFor(Player const* player) const;
18581
18582 void GetInitialVisiblePackets(Unit* target);
18583 void UpdateObjectVisibility(bool forced = true, bool fromUpdate = false) override;
18584 void UpdateVisibilityForPlayer(bool mapChange = false);
18585 void UpdateVisibilityOf(WorldObject* target);
18587
18588 template<class T>
18589 void UpdateVisibilityOf(T* target, UpdateData& data, std::vector<Unit*>& visibleNow);
18590
18592
18593 [[nodiscard]] bool HasAtLoginFlag(AtLoginFlags f) const { return m_atLoginFlags & f; }
18595 void RemoveAtLoginFlag(AtLoginFlags flags, bool persist = false);
18596
18597 bool IsUsingLfg();
18598 bool inRandomLfgDungeon();
18599
18600 typedef std::set<uint32> DFQuestsDoneList;
18602
18603 // Temporarily removed pet cache
18608 [[nodiscard]] bool IsPetNeedBeTemporaryUnsummoned() const { return GetSession()->PlayerLogout() || !IsInWorld() || !IsAlive() || IsMounted()/*+in flight*/ || GetVehicle() || IsBeingTeleported(); }
18609 bool CanResummonPet(uint32 spellid);
18610
18611 void SendCinematicStart(uint32 CinematicSequenceId) const;
18612 void SendMovieStart(uint32 MovieId);
18613
18614 uint32 DoRandomRoll(uint32 minimum, uint32 maximum);
18615
18616 [[nodiscard]] uint16 GetMaxSkillValueForLevel() const;
18617 bool IsFFAPvP();
18618 bool IsPvP();
18619
18620 /*********************************************************/
18621 /*** INSTANCE SYSTEM ***/
18622 /*********************************************************/
18623
18624 void UpdateHomebindTime(uint32 time);
18625
18627 bool m_InstanceValid;
18628 void BindToInstance();
18629 void SetPendingBind(uint32 instanceId, uint32 bindTimer) { _pendingBindId = instanceId; _pendingBindTimer = bindTimer; }
18630 [[nodiscard]] bool HasPendingBind() const { return _pendingBindId > 0; }
18631 [[nodiscard]] uint32 GetPendingBind() const { return _pendingBindId; }
18632 void SendRaidInfo();
18633 void SendSavedInstances();
18634 void PrettyPrintRequirementsQuestList(const std::vector<const ProgressionRequirement*>& missingQuests) const;
18635 void PrettyPrintRequirementsAchievementsList(const std::vector<const ProgressionRequirement*>& missingAchievements) const;
18636 void PrettyPrintRequirementsItemsList(const std::vector<const ProgressionRequirement*>& missingItems) const;
18637 bool Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map, bool report = false);
18639 [[nodiscard]] bool CheckInstanceCount(uint32 instanceId) const;
18640
18641 void AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
18642 {
18643 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
18644 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
18645 }
18646
18647 // last used pet number (for BG's)
18648 [[nodiscard]] uint32 GetLastPetNumber() const { return m_lastpetnumber; }
18649 void SetLastPetNumber(uint32 petnumber) { m_lastpetnumber = petnumber; }
18650 [[nodiscard]] uint32 GetLastPetSpell() const { return m_oldpetspell; }
18651 void SetLastPetSpell(uint32 petspell) { m_oldpetspell = petspell; }
18652
18653 /*********************************************************/
18654 /*** GROUP SYSTEM ***/
18655 /*********************************************************/
18656
18657 Group* GetGroupInvite() { return m_groupInvite; }
18658 void SetGroupInvite(Group* group) { m_groupInvite = group; }
18659 Group* GetGroup() { return m_group.getTarget(); }
18660 [[nodiscard]] const Group* GetGroup() const { return (const Group*)m_group.getTarget(); }
18661 GroupReference& GetGroupRef() { return m_group; }
18662 void SetGroup(Group* group, int8 subgroup = -1);
18663 [[nodiscard]] uint8 GetSubGroup() const { return m_group.getSubGroup(); }
18664 [[nodiscard]] uint32 GetGroupUpdateFlag() const { return m_groupUpdateMask; }
18665 void SetGroupUpdateFlag(uint32 flag) { m_groupUpdateMask |= flag; }
18666 [[nodiscard]] uint64 GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; }
18667 void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); }
18668 Player* GetNextRandomRaidMember(float radius);
18669 [[nodiscard]] PartyResult CanUninviteFromGroup(ObjectGuid targetPlayerGUID = ObjectGuid::Empty) const;
18670
18671 // Battleground Group System
18672 void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1);
18676 [[nodiscard]] uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); }
18677 void SetOriginalGroup(Group* group, int8 subgroup = -1);
18678
18679 void SetPassOnGroupLoot(bool bPassOnGroupLoot) { m_bPassOnGroupLoot = bPassOnGroupLoot; }
18680 [[nodiscard]] bool GetPassOnGroupLoot() const { return m_bPassOnGroupLoot; }
18681
18682 MapReference& GetMapRef() { return m_mapRef; }
18683
18684 // Set map to player and add reference
18685 void SetMap(Map* map) override;
18686 void ResetMap() override;
18687
18688 bool CanTeleport() { return m_canTeleport; }
18689 void SetCanTeleport(bool value) { m_canTeleport = value; }
18690 bool CanKnockback() { return m_canKnockback; }
18691 void SetCanKnockback(bool value) { m_canKnockback = value; }
18692
18693 bool isAllowedToLoot(Creature const* creature);
18694
18695 [[nodiscard]] DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
18696 [[nodiscard]] uint8 GetRunesState() const { return m_runes->runeState; }
18697 [[nodiscard]] RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); }
18698 [[nodiscard]] RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); }
18699 [[nodiscard]] uint32 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; }
18700 [[nodiscard]] uint32 GetGracePeriod(uint8 index) const { return m_runes->runes[index].GracePeriod; }
18701 uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace);
18702 [[nodiscard]] bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const;
18704 void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; }
18705 void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; }
18706 void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; }
18707 void SetRuneCooldown(uint8 index, uint32 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0)); }
18708 void SetGracePeriod(uint8 index, uint32 period) { m_runes->runes[index].GracePeriod = period; }
18709 void SetRuneConvertAura(uint8 index, AuraEffect const* aura) { m_runes->runes[index].ConvertAura = aura; }
18710 void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura) { SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
18711 void RemoveRunesByAuraEffect(AuraEffect const* aura);
18712 void RestoreBaseRune(uint8 index);
18713 void ConvertRune(uint8 index, RuneType newType);
18714 void ResyncRunes(uint8 count);
18715 void AddRunePower(uint8 index);
18716 void InitRunes();
18717
18718 void SendRespondInspectAchievements(Player* player) const;
18719 [[nodiscard]] bool HasAchieved(uint32 achievementId) const;
18720 void ResetAchievements();
18722 void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete = false);
18723 void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = nullptr);
18724 void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
18726 void CompletedAchievement(AchievementEntry const* entry);
18727 [[nodiscard]] AchievementMgr* GetAchievementMgr() const { return m_achievementMgr; }
18728
18729 void SetCreationTime(Seconds creationTime) { m_creationTime = creationTime; }
18730 [[nodiscard]] Seconds GetCreationTime() const { return m_creationTime; }
18731
18732 [[nodiscard]] bool HasTitle(uint32 bitIndex) const;
18733 bool HasTitle(CharTitlesEntry const* title) const { return HasTitle(title->bit_index); }
18734 void SetTitle(CharTitlesEntry const* title, bool lost = false);
18735 void SetCurrentTitle(CharTitlesEntry const* title, bool clear = false) { SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };
18736
18737 //bool isActiveObject() const { return true; }
18738 bool CanSeeSpellClickOn(Creature const* creature) const;
18739 [[nodiscard]] bool CanSeeVendor(Creature const* creature) const;
18740
18741 [[nodiscard]] uint32 GetChampioningFaction() const { return m_ChampioningFaction; }
18742 void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; }
18744
18745 float GetAverageItemLevel();
18748
18749 void ClearWhisperWhiteList() { WhisperList.clear(); }
18750 void AddWhisperWhiteList(ObjectGuid guid) { WhisperList.push_back(guid); }
18752 void RemoveFromWhisperWhiteList(ObjectGuid guid) { WhisperList.remove(guid); }
18753
18754 bool SetDisableGravity(bool disable, bool packetOnly = false, bool updateAnimationTier = true) override;
18755 bool SetCanFly(bool apply, bool packetOnly = false) override;
18756 bool SetWaterWalking(bool apply, bool packetOnly = false) override;
18757 bool SetFeatherFall(bool apply, bool packetOnly = false) override;
18758 bool SetHover(bool enable, bool packetOnly = false, bool updateAnimationTier = true) override;
18759
18760 [[nodiscard]] bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
18761 [[nodiscard]] bool CanEnterWater() const override { return true; }
18762
18763 // OURS
18764 // saving
18766 // arena spectator
18767 [[nodiscard]] bool IsSpectator() const { return m_ExtraFlags & PLAYER_EXTRA_SPECTATOR_ON; }
18768 void SetIsSpectator(bool on);
18769 [[nodiscard]] bool NeedSendSpectatorData() const;
18770 void SetPendingSpectatorForBG(uint32 bgInstanceId) { m_pendingSpectatorForBG = bgInstanceId; }
18771 [[nodiscard]] bool HasPendingSpectatorForBG(uint32 bgInstanceId) const { return m_pendingSpectatorForBG == bgInstanceId; }
18781
18782 // Dancing Rune weapon
18783 void setRuneWeaponGUID(ObjectGuid guid) { m_drwGUID = guid; };
18786
18787 [[nodiscard]] bool CanSeeDKPet() const { return m_ExtraFlags & PLAYER_EXTRA_SHOW_DK_PET; }
18788 void SetShowDKPet(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_SHOW_DK_PET; else m_ExtraFlags &= ~PLAYER_EXTRA_SHOW_DK_PET; };
18789 void PrepareCharmAISpells();
18791
18792 bool NeedToSaveGlyphs() { return m_NeedToSaveGlyphs; }
18793 void SetNeedToSaveGlyphs(bool val) { m_NeedToSaveGlyphs = val; }
18794
18796 void SetMountBlockId(uint32 mount) { m_MountBlockId = mount; }
18797
18798 [[nodiscard]] float GetRealParry() const { return m_realParry; }
18799 [[nodiscard]] float GetRealDodge() const { return m_realDodge; }
18800 // mt maps
18801 [[nodiscard]] const PlayerTalentMap& GetTalentMap() const { return m_talents; }
18802 [[nodiscard]] uint32 GetNextSave() const { return m_nextSave; }
18803 [[nodiscard]] SpellModList const& GetSpellModList(uint32 type) const { return m_spellMods[type]; }
18804
18807
18808 static std::unordered_map<int, bgZoneRef> bgZoneIdToFillWorldStates; // zoneId -> FillInitialWorldStates
18809
18810 void SetFarSightDistance(float radius);
18811 void ResetFarSightDistance();
18812 [[nodiscard]] Optional<float> GetFarSightDistance() const;
18813
18814 float GetSightRange(WorldObject const* target = nullptr) const override;
18815
18816 std::string GetPlayerName();
18817
18818 // Settings
18819 [[nodiscard]] PlayerSetting GetPlayerSetting(std::string source, uint8 index);
18820 void UpdatePlayerSetting(std::string source, uint8 index, uint32 value);
18821
18822 void SendSystemMessage(std::string_view msg, bool escapeCharacters = false);
18823
18824 std::string GetDebugInfo() const override;
18825
18826 /*********************************************************/
18827 /*** SPELL QUEUE SYSTEM ***/
18828 /*********************************************************/
18829protected:
18831 void ProcessSpellQueue();
18832
18833public:
18834 std::deque<PendingSpellCastRequest> SpellQueue;
18835 const PendingSpellCastRequest* GetCastRequest(uint32 category) const;
18836 bool CanExecutePendingSpellCastRequest(SpellInfo const* spellInfo);
18837 void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest* castRequest, bool isCancel = false);
18838 bool CanRequestSpellCast(SpellInfo const* spellInfo);
18839
18840protected:
18841 // Gamemaster whisper whitelist
18843
18844 // Performance Varibales
18845 bool m_NeedToSaveGlyphs;
18846 // Mount block bug
18848 // Real stats
18849 float m_realDodge;
18850 float m_realParry;
18851
18853
18859
18860 /*********************************************************/
18861 /*** BATTLEGROUND SYSTEM ***/
18862 /*********************************************************/
18863
18864 struct BgBattlegroundQueueID_Rec
18865 {
18868 };
18869
18870 std::array<BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES> _BgBattlegroundQueueID;
18872 bool m_IsBGRandomWinner;
18873
18874 /*********************************************************/
18875 /*** ENTRY POINT ***/
18876 /*********************************************************/
18877
18879
18880 /*********************************************************/
18881 /*** QUEST SYSTEM ***/
18882 /*********************************************************/
18883
18884 //We allow only one timed quest active at the same time. Below can then be simple value instead of set.
18885 typedef std::set<uint32> QuestSet;
18886 typedef std::set<uint32> SeasonalQuestSet;
18887 typedef std::unordered_map<uint32, SeasonalQuestSet> SeasonalEventQuestMap;
18892
18895
18896 /*********************************************************/
18897 /*** LOAD SYSTEM ***/
18898 /*********************************************************/
18899
18900 void _LoadActions(PreparedQueryResult result);
18901 void _LoadAuras(PreparedQueryResult result, uint32 timediff);
18902 void _LoadGlyphAuras();
18903 void _LoadInventory(PreparedQueryResult result, uint32 timeDiff);
18904 void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult);
18905 static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint32 mailId, Mail* mail, Field* fields);
18913 void _LoadGroup();
18914 void _LoadSkills(PreparedQueryResult result);
18915 void _LoadSpells(PreparedQueryResult result);
18919 void _LoadArenaTeamInfo();
18922 void _LoadGlyphs(PreparedQueryResult result);
18923 void _LoadTalents(PreparedQueryResult result);
18927 void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result);
18928
18929 /*********************************************************/
18930 /*** SAVE SYSTEM ***/
18931 /*********************************************************/
18932
18934 void _SaveAuras(CharacterDatabaseTransaction trans, bool logout);
18948 void _SaveCharacter(bool create, CharacterDatabaseTransaction trans);
18951
18952 /*********************************************************/
18953 /*** ENVIRONMENTAL SYSTEM ***/
18954 /*********************************************************/
18955 void HandleSobering();
18956 void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen);
18958 void HandleDrowning(uint32 time_diff);
18960
18961 /*********************************************************/
18962 /*** HONOR SYSTEM ***/
18963 /*********************************************************/
18964 time_t m_lastHonorUpdateTime;
18965
18966 void outDebugValues() const;
18968
18969 TeamId m_team;
18970 uint32 m_nextSave; // pussywizard
18971 uint16 m_additionalSaveTimer; // pussywizard
18972 uint8 m_additionalSaveMask; // pussywizard
18973 uint16 m_hostileReferenceCheckTimer; // pussywizard
18974 std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> m_chatFloodData;
18978
18980
18983
18984 std::vector<Item*> m_itemUpdateQueue;
18986
18988
18991
18995
18997
19000
19004 uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
19005
19007
19010
19012
19014
19022
19024 //uint32 m_pad;
19025 // Spell* m_spellModTakingSpell; // Spell for which charges are dropped in spell::finish
19026
19030 std::mutex m_soulboundTradableLock;
19031
19036
19038
19039 typedef std::list<Channel*> JoinedChannelsList;
19041
19043
19045
19050 time_t m_lastDailyQuestTime;
19051
19054
19058
19060 time_t m_deathExpireTime;
19061
19064 bool m_canParry;
19065 bool m_canBlock;
19066 bool m_canTitanGrip;
19068 float m_ammoDPS;
19069
19071 time_t _restTime;
19073 float _restBonus;
19077 time_t m_resetTalentsTime;
19081
19082 // Social
19084
19085 // Groups
19091 bool m_bPassOnGroupLoot;
19092
19093 // last used pet number (for BG's)
19095
19096 // Player summoning
19097 time_t m_summon_expire;
19099 float m_summon_x;
19100 float m_summon_y;
19101 float m_summon_z;
19103
19105 Runes* m_runes;
19107
19108 bool CanAlwaysSee(WorldObject const* obj) const override;
19109
19110 bool IsAlwaysDetectableFor(WorldObject const* seer) const override;
19111
19113
19114 bool m_needZoneUpdate;
19115
19116private:
19117 // internal common parts for CanStore/StoreItem functions
19118 InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const;
19119 InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, bool non_specialized, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;
19120 InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;
19121 Item* _StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool update);
19122 Item* _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field* fields);
19123
19125
19128 void SendRefundInfo(Item* item);
19129 void RefundItem(Item* item);
19130
19131 // know currencies are not removed at any point (0 displayed)
19132 void AddKnownCurrency(uint32 itemId);
19133
19134 void AdjustQuestReqItemCount(Quest const* quest, QuestStatusData& questStatusData);
19135
19136 [[nodiscard]] bool MustDelayTeleport() const { return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end
19137 void SetMustDelayTeleport(bool setting) { m_bMustDelayTeleport = setting; }
19138 [[nodiscard]] bool HasDelayedTeleport() const { return m_bHasDelayedTeleport; }
19139 void SetHasDelayedTeleport(bool setting) { m_bHasDelayedTeleport = setting; }
19140
19142
19143 void UpdateCharmedAI();
19144
19146 float m_lastFallZ;
19147
19151 bool m_isInWater;
19152
19153 // Current teleport data
19158
19162 bool m_canTeleport;
19163 bool m_canKnockback;
19164
19165 std::unique_ptr<PetStable> m_petStable;
19166
19167 // Temporary removed pet cache
19170
19173
19175
19177
19181
19183
19184 // duel health and mana reset attributes
19187
19189
19191
19193
19195
19196 bool _wasOutdoor;
19197
19199
19201};
19202
19203void AddItemsSetItem(Player* player, Item* item);
19204void RemoveItemsSetItem(Player* player, ItemTemplate const* proto);
19205
19206#endif
ArenaTeamInfoType
Definition ArenaTeam.h:73
AchievementCriteriaTimedTypes
Definition DBCEnums.h:109
AchievementCriteriaCondition
Definition DBCEnums.h:86
AchievementCriteriaTypes
Definition DBCEnums.h:121
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:27
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
ItemClass
Definition ItemTemplate.h:290
BuyResult
Definition Item.h:140
SellResult
Definition Item.h:154
LootError
Definition LootMgr.h:95
LootType
Definition LootMgr.h:77
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition ObjectGuid.h:257
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:254
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:253
std::map< std::string, PlayerSettingVector > PlayerSettingMap
Definition PlayerSettings.h:49
PlayerCharmedAISpells
Definition Player.h:919
@ SPELL_HIGH_DAMAGE2
Definition Player.h:925
QuestSound
Definition Player.h:249
std::deque< Mail * > PlayerMails
Definition Player.h:67
std::list< PlayerCreateInfoSkill > PlayerCreateInfoSkills
Definition Player.h:337
TrainerSpellState
Definition Player.h:212
ReferAFriendError
Definition Player.h:970
@ ERR_REFER_A_FRIEND_TARGET_TOO_HIGH
Definition Player.h:973
@ ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S
Definition Player.h:984
@ ERR_REFER_A_FRIEND_DIFFERENT_FACTION
Definition Player.h:976
@ ERR_REFER_A_FRIEND_NONE
Definition Player.h:971
@ ERR_REFER_A_FRIEND_NO_TARGET
Definition Player.h:979
@ ERR_REFER_A_FRIEND_NOT_NOW
Definition Player.h:977
@ ERR_REFER_A_FRIEND_INSUF_EXPAN_LVL
Definition Player.h:983
@ ERR_REFER_A_FRIEND_INSUFFICIENT_GRANTABLE_LEVELS
Definition Player.h:974
@ ERR_REFER_A_FRIEND_NOT_REFERRED_BY
Definition Player.h:972
@ ERR_REFER_A_FRIEND_TOO_FAR
Definition Player.h:975
@ ERR_REFER_A_FRIEND_SUMMON_LEVEL_MAX_I
Definition Player.h:981
@ ERR_REFER_A_FRIEND_NOT_IN_GROUP
Definition Player.h:980
@ ERR_REFER_A_FRIEND_GRANT_LEVEL_MAX_I
Definition Player.h:978
@ ERR_REFER_A_FRIEND_SUMMON_COOLDOWN
Definition Player.h:982
TeleportToOptions
Definition Player.h:825
EnviromentalDamage
Type of environmental damages.
Definition Player.h:838
@ DAMAGE_FIRE
Definition Player.h:844
std::list< SpellModifier * > SpellModList
Definition Player.h:194
@ RUNE_UNHOLY
Definition Player.h:415
@ RUNE_DEATH
Definition Player.h:417
@ RUNE_FROST
Definition Player.h:416
DuelState
Definition Player.h:374
PlayerFieldByte2Flags
Definition Player.h:571
@ PLAYER_FIELD_BYTE2_STEALTH
Definition Player.h:573
@ PLAYER_FIELD_BYTE2_INVISIBILITY_GLOW
Definition Player.h:574
@ PLAYER_FIELD_BYTE2_NONE
Definition Player.h:572
QuestSlotStateMask
Definition Player.h:636
@ QUEST_STATE_NONE
Definition Player.h:637
PlayerFieldByteFlags
Definition Player.h:563
@ PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW
Definition Player.h:566
@ PLAYER_FIELD_BYTE_TRACK_STEALTHED
Definition Player.h:564
TransferAbortReason
Definition Player.h:787
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
Definition Player.h:792
@ TRANSFER_ABORT_NOT_FOUND1
Definition Player.h:799
@ TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES
Definition Player.h:797
@ TRANSFER_ABORT_MAX_PLAYERS
Definition Player.h:790
@ TRANSFER_ABORT_NOT_FOUND3
Definition Player.h:801
@ TRANSFER_ABORT_ZONE_IN_COMBAT
Definition Player.h:793
@ TRANSFER_ABORT_NONE
Definition Player.h:788
@ TRANSFER_ABORT_NOT_FOUND
Definition Player.h:791
@ TRANSFER_ABORT_NEED_GROUP
Definition Player.h:798
@ TRANSFER_ABORT_NOT_FOUND2
Definition Player.h:800
@ TRANSFER_ABORT_REALM_ONLY
Definition Player.h:802
@ TRANSFER_ABORT_ERROR
Definition Player.h:789
PlayerExtraFlags
Definition Player.h:588
KeyRingSlots
Definition Player.h:734
InventoryPackSlots
Definition Player.h:709
@ PLAYER_FLAGS_UNK28
Definition Player.h:507
@ PLAYER_FLAGS_PLAYED_LONG_TIME
Definition Player.h:491
@ PLAYER_FLAGS_UNK27
Definition Player.h:506
@ PLAYER_FLAGS_UNK26
Definition Player.h:505
@ PLAYER_FLAGS_UNK16
Definition Player.h:495
@ PLAYER_FLAGS_UNK20
Definition Player.h:499
@ PLAYER_FLAGS_TAXI_BENCHMARK
Definition Player.h:496
@ PLAYER_FLAGS_UNK24
Definition Player.h:503
@ PLAYER_FLAGS_UNK6
Definition Player.h:485
@ PLAYER_FLAGS_UNK31
Definition Player.h:510
@ PLAYER_FLAGS_UNK21
Definition Player.h:500
@ PLAYER_FLAGS_UNK29
Definition Player.h:508
@ PLAYER_FLAGS_UNK7
Definition Player.h:486
@ PLAYER_FLAGS_UBER
Definition Player.h:498
@ PLAYER_FLAGS_UNK30
Definition Player.h:509
@ PLAYER_FLAGS_PLAYED_TOO_LONG
Definition Player.h:492
CurrencyItems
Definition Player.h:964
ActionButtonUpdateState
Definition Player.h:220
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:208
std::list< uint32 > PlayerCreateInfoSpells
Definition Player.h:317
InstantFlightGossipAction
Definition Player.h:1022
std::unordered_map< uint32, time_t > InstanceTimeMap
Definition Player.h:209
std::map< uint32, bool > QuestStatusSaveMap
Definition Player.h:623
std::unordered_set< uint32 > RewardedQuestSet
Definition Player.h:620
RuneCooldowns
Definition Player.h:406
@ RUNE_MISS_COOLDOWN
Definition Player.h:409
std::list< PlayerCreateInfoItem > PlayerCreateInfoItems
Definition Player.h:291
PlayerFieldBytesOffsets
Definition Player.h:540
@ PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK
Definition Player.h:544
@ PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES
Definition Player.h:543
@ PLAYER_FIELD_BYTES_OFFSET_RAF_GRANTABLE_LEVEL
Definition Player.h:542
@ PLAYER_FIELD_BYTES_OFFSET_FLAGS
Definition Player.h:541
PlayerCommandStates
Definition Player.h:1002
@ CHEAT_COOLDOWN
Definition Player.h:1006
@ CHEAT_WATERWALK
Definition Player.h:1008
@ CHEAT_CASTTIME
Definition Player.h:1005
PlayerDelayedOperations
Definition Player.h:907
RestFlag
Definition Player.h:818
@ ACTION_BUTTON_EQSET
Definition Player.h:231
@ ACTION_BUTTON_C
Definition Player.h:230
@ ACTION_BUTTON_MACRO
Definition Player.h:232
@ ACTION_BUTTON_CMACRO
Definition Player.h:233
BuyBackSlots
Definition Player.h:727
std::map< uint8, ActionButton > ActionButtonList
Definition Player.h:281
@ XPSOURCE_KILL
Definition Player.h:1014
InventorySlots
Definition Player.h:703
QuestSlotOffsets
Definition Player.h:626
std::unordered_map< uint32, SkillStatusData > SkillStatusMap
Definition Player.h:659
#define ACTION_BUTTON_TYPE(X)
Definition Player.h:254
PlayerMovementType
Definition Player.h:460
BankBagSlots
Definition Player.h:721
std::list< PlayerCreateInfoAction > PlayerCreateInfoActions
Definition Player.h:329
CurrencyTokenSlots
Definition Player.h:740
BuyBankSlotResult
Definition Player.h:110
@ ERR_BANKSLOT_NOTBANKER
Definition Player.h:113
@ ERR_BANKSLOT_FAILED_TOO_MANY
Definition Player.h:111
@ ERR_BANKSLOT_OK
Definition Player.h:114
@ ERR_BANKSLOT_INSUFFICIENT_FUNDS
Definition Player.h:112
BankItemSlots
Definition Player.h:715
PlayedTimeIndex
Definition Player.h:859
SpellModType
Definition Player.h:92
#define MAX_PLAYED_TIME_INDEX
Definition Player.h:864
PlayerUnderwaterState
Definition Player.h:99
InstanceResetWarningType
Definition Player.h:807
@ RAID_INSTANCE_EXPIRED
Definition Player.h:812
std::map< uint32, EquipmentSet > EquipmentSets
Definition Player.h:767
AtLoginFlags
Definition Player.h:603
@ AT_LOGIN_RESET_PET_TALENTS
Definition Player.h:609
@ AT_LOGIN_RESET_AP
Definition Player.h:613
@ AT_LOGIN_RESET_ARENA
Definition Player.h:614
@ AT_LOGIN_CHECK_ACHIEVS
Definition Player.h:615
PlayerBytes3Offsets
Definition Player.h:532
@ PLAYER_BYTES_3_OFFSET_PVP_TITLE
Definition Player.h:535
@ PLAYER_BYTES_3_OFFSET_GENDER
Definition Player.h:533
@ PLAYER_BYTES_3_OFFSET_ARENA_FACTION
Definition Player.h:536
std::ostringstream & operator<<(std::ostringstream &ss, PlayerTaxi const &taxi)
Definition PlayerTaxi.cpp:228
CharDeleteMethod
Definition Player.h:957
TalentTree
Definition Player.h:144
PlayerRestState
Definition Player.h:988
#define ACTION_BUTTON_ACTION(X)
Definition Player.h:253
std::list< EnchantDuration > EnchantDurationList
Definition Player.h:456
AdditionalSaving
Definition Player.h:995
@ ADDITIONAL_SAVING_NONE
Definition Player.h:996
PlayerBytesOffsets
Definition Player.h:516
@ PLAYER_BYTES_OFFSET_HAIR_COLOR_ID
Definition Player.h:520
@ PLAYER_BYTES_OFFSET_HAIR_STYLE_ID
Definition Player.h:519
@ PLAYER_BYTES_OFFSET_SKIN_ID
Definition Player.h:517
@ PLAYER_BYTES_OFFSET_FACE_ID
Definition Player.h:518
MirrorTimerType
Definition Player.h:578
SkillUpdateState
Definition Player.h:643
DrunkenState
Definition Player.h:468
ReputationSource
Definition Player.h:238
PlayerFieldBytes2Offsets
Definition Player.h:548
@ PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID
Definition Player.h:549
@ PLAYER_FIELD_BYTES_2_OFFSET_AURA_VISION
Definition Player.h:551
@ PLAYER_FIELD_BYTES_2_OFFSET_IGNORE_POWER_REGEN_PREDICTION_MASK
Definition Player.h:550
PlayerChatTag
Definition Player.h:849
std::map< uint32, QuestStatusData > QuestStatusMap
Definition Player.h:619
PlayerBytes2Offsets
Definition Player.h:524
@ PLAYER_BYTES_2_OFFSET_PARTY_TYPE
Definition Player.h:526
@ PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS
Definition Player.h:527
@ PLAYER_BYTES_2_OFFSET_REST_STATE
Definition Player.h:528
@ PLAYER_BYTES_2_OFFSET_FACIAL_STYLE
Definition Player.h:525
EmoteBroadcastTextID
Definition Player.h:1027
@ EMOTE_BROADCAST_TEXT_ID_STRANGE_GESTURES
Definition Player.h:1028
PlayerSlots
Definition Player.h:667
PlayerLoginQueryIndex
Definition Player.h:868
@ MAX_PLAYER_LOGIN_QUERY
Definition Player.h:903
@ PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA
Definition Player.h:889
@ PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION
Definition Player.h:899
GuidList WhisperListContainer
Definition Player.h:196
std::list< Item * > ItemDurationList
Definition Player.h:457
ServerSideVisibilityType
Definition SharedDefines.h:1272
GameobjectTypes
Definition SharedDefines.h:1559
MailResponseType
Definition SharedDefines.h:3499
DuelCompleteType
Definition SharedDefines.h:3611
MailResponseResult
Definition SharedDefines.h:3509
BattlegroundQueueTypeId
Definition SharedDefines.h:3619
RemoveMethod
Definition SharedDefines.h:3586
@ GROUP_REMOVEMETHOD_DEFAULT
Definition SharedDefines.h:3587
PartyResult
Definition SharedDefines.h:3704
SpellModOp
Definition SpellDefines.h:75
ClassContext
Definition UnitDefines.h:225
@ CLASS_CONTEXT_NONE
Definition UnitDefines.h:226
SheathState
Definition UnitDefines.h:125
BaseModType
Definition Unit.h:188
#define MOD_END
Definition Unit.h:193
DeathState
Definition Unit.h:196
Say
Definition boss_broodlord_lashlayer.cpp:29
Definition WorldSession.h:268
Definition CinematicMgr.h:33
Definition CharmInfo.h:80
Definition Object.h:352
void AddToUpdateQueueOf(Player *player)
Definition Item.cpp:744
void RemoveFromUpdateQueueOf(Player *player)
Definition Item.cpp:764
Definition LootMgr.h:207
Definition MapReference.h:25
Definition SocialMgr.h:101
Definition PlayerTaxi.h:26
uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
Definition Player.cpp:13289
void AddNewMailDeliverTime(time_t deliver_time)
Definition Player.cpp:2904
void ReputationChanged(FactionEntry const *factionEntry)
Definition PlayerQuest.cpp:2208
bool CanSpeak() const
Definition PlayerMisc.cpp:69
std::string GetPlayerName()
Definition Player.cpp:16332
void CleanupChannels()
Definition Player.cpp:5023
void ProcessTerrainStatusUpdate() override
Definition PlayerUpdates.cpp:2243
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
Definition StatSystem.cpp:527
void SendInitialPacketsAfterAddToMap()
Definition Player.cpp:11672
void ResetSeasonalQuestStatus(uint16 event_id)
Definition Player.cpp:12213
uint32 GetPendingBind() const
Definition Player.h:2448
uint32 GetArmorProficiency() const
Definition Player.h:1372
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10114
void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
Definition Player.cpp:2880
SpellModList const & GetSpellModList(uint32 type) const
Definition Player.h:2620
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13520
std::set< uint32 > SeasonalQuestSet
Definition Player.h:2703
void RemoveRunesByAuraEffect(AuraEffect const *aura)
Definition Player.cpp:13426
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12276
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
void SaveHealthBeforeDuel()
Definition Player.h:2169
void SendSystemMessage(std::string_view msg, bool escapeCharacters=false)
Definition Player.cpp:16394
void UpdateRuneRegen(RuneType rune)
Definition StatSystem.cpp:958
void removeActionButton(uint8 button)
Definition Player.cpp:5658
void SetNeedZoneUpdate(bool needUpdate)
Definition Player.h:1867
static void OfflineResurrect(ObjectGuid const guid, CharacterDatabaseTransaction trans)
Definition Player.cpp:4604
void HandleFall(MovementInfo const &movementInfo)
Definition Player.cpp:13888
std::size_t GetRewardedQuestCount() const
Definition Player.h:1637
void SetSummonPoint(uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
Definition Player.cpp:16354
uint8 GetChatTag() const
Definition Player.cpp:1307
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5620
void setTeamId(TeamId teamid)
Definition Player.h:2118
void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask)
Definition Player.cpp:10138
uint64 GetAuraUpdateMaskForRaid() const
Definition Player.h:2483
void AddBonusTalent(uint32 count)
Definition Player.h:1743
void RemoveSpellMods(Spell *spell)
Definition Player.cpp:10046
void ToggleMetaGemsActive(uint8 exceptslot, bool apply)
Definition Player.cpp:11288
uint32 GetSaveTimer() const
Definition Player.h:2363
void RewardExtraBonusTalentPoints(uint32 bonusTalentPoints)
Definition Player.cpp:6087
uint8 GetRank() const
Definition Player.h:1906
bool HasQuestForGO(int32 GOId) const
Definition Player.cpp:12419
bool HasTankSpec()
Definition Player.cpp:16104
bool UpdateFishingSkill()
Definition PlayerUpdates.cpp:883
bool isGMVisible() const
Definition Player.h:1181
bool GetRandomWinner()
Definition Player.h:2299
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1907
uint32 GetFreeInventorySpace() const
Definition PlayerStorage.cpp:466
void SetSummonAsSpectator(bool on)
Definition Player.h:1116
void SendRemoveControlBar()
Definition Player.cpp:9734
void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
Definition Player.cpp:11773
static uint32 GetZoneIdFromDB(ObjectGuid guid)
Definition Player.cpp:6351
void SummonIfPossible(bool agree, ObjectGuid summoner_guid)
Definition Player.cpp:12455
void SetFarSightDistance(float radius)
Definition Player.cpp:16306
void SetLastUsedRune(RuneType type)
Definition Player.h:2521
float GetMissPercentageFromDefence() const
Definition StatSystem.cpp:708
bool IsInWhisperWhiteList(ObjectGuid guid)
Definition Player.cpp:15926
bool isResurrectRequestedBy(ObjectGuid guid) const
Definition Player.h:1834
uint32 GetTemporaryUnsummonedPetNumber() const
Definition Player.h:2421
void SetServerSideVisibility(ServerSideVisibilityType type, AccountTypes sec)
Definition Player.cpp:16292
std::string autoReplyMsg
Definition Player.h:1154
uint32 GetCurrentBattlegroundQueueSlot() const
Definition Player.h:2264
RewardedQuestSet const & getRewardedQuests() const
Definition Player.h:1633
InventoryResult CanRollForItemInLFG(ItemTemplate const *item, WorldObject const *lootedObject) const
Definition PlayerStorage.cpp:2337
void SetInWater(bool apply)
Definition Player.cpp:2186
bool HasWeapon(WeaponAttackType type) const override
Definition Player.h:1268
void ClearAfkReports()
Definition Player.h:2292
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
void DestroyForPlayer(Player *target, bool onDeath=false) const override
Definition Player.cpp:3861
void SplitItem(uint16 src, uint16 dst, uint32 count)
Definition PlayerStorage.cpp:3421
void _LoadFriendList(PreparedQueryResult result)
bool IsInvitedForBattlegroundInstance() const
Definition Player.h:2265
void ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
Definition Player.cpp:10576
void SetGrantableLevels(uint8 val)
Definition Player.h:2131
uint32 DoRandomRoll(uint32 minimum, uint32 maximum)
Definition Player.cpp:16213
bool HasMeleeSpec()
Definition Player.cpp:16122
void SendAttackSwingDeadTarget()
Definition PlayerMisc.cpp:128
Item * GetItemByEntry(uint32 entry) const
Definition PlayerStorage.cpp:3369
std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
Definition Player.h:1671
void BuildEnchantmentsInfoData(WorldPacket *data)
Definition Player.cpp:14470
void SetCanParry(bool value)
Definition Player.cpp:13165
GroupReference & GetGroupRef()
Definition Player.h:2478
uint32 GetInGameTime()
Definition Player.h:1561
GroupReference & GetOriginalGroupRef()
Definition Player.h:2492
void UpdatePotionCooldown(Spell *spell=nullptr)
Definition PlayerUpdates.cpp:1539
bool CanTameExoticPets() const
Definition Player.h:2197
bool CanFly() const override
Definition Player.h:2577
void CharmSpellInitialize()
Definition Player.cpp:9680
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1020
void SetTemporaryUnsummonedPetNumber(uint32 petnumber)
Definition Player.h:2422
DeclinedName const * GetDeclinedNames() const
Definition Player.h:2512
void ReputationChanged2(FactionEntry const *factionEntry)
Definition PlayerQuest.cpp:2236
static void Customize(CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
Definition PlayerMisc.cpp:114
BGData & GetBGData()
Definition Player.h:2267
void Update(uint32 time) override
Definition PlayerUpdates.cpp:53
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Player.h:2484
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Player.cpp:461
void UpdateEnchantmentDurations()
Definition PlayerStorage.cpp:4734
float GetTotalBaseModValue(BaseModGroup modGroup) const
Definition Player.cpp:5093
bool CanUseBattlegroundObject(GameObject *gameobject) const
Definition Player.cpp:13259
void GetTalentTreePoints(uint8(&specPoints)[3]) const
Definition Player.cpp:15318
bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12267
uint32 GetDeathTimer() const
Definition Player.h:2184
bool UpdateCraftSkill(uint32 spellid)
Definition PlayerUpdates.cpp:821
void SendQuestConfirmAccept(Quest const *quest, Player *pReceiver)
Definition PlayerQuest.cpp:2413
void SetEntryPoint()
Definition Player.cpp:11321
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2068
bool CanKnockback()
Definition Player.h:2507
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4838
void SetDeveloper(bool on)
Definition Player.h:1172
void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
Definition Player.h:1914
void CompletedAchievement(AchievementEntry const *entry)
Definition Player.cpp:13976
std::set< uint32 > DFQuestsDoneList
Definition Player.h:2417
bool inRandomLfgDungeon()
Definition Player.cpp:13113
void SetCanKnockback(bool value)
Definition Player.h:2508
bool IsInWater() const override
Definition Player.h:1136
void TalkedToCreature(uint32 entry, ObjectGuid guid)
Definition PlayerQuest.cpp:2112
bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const *bySpell)
Definition Player.cpp:13684
void RemoveMail(uint32 id)
Definition Player.cpp:2867
void setWeaponChangeTimer(uint32 time)
Definition Player.h:1614
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Player.cpp:15956
void RemoveFromBattlegroundOrBattlefieldRaid()
Definition Player.cpp:13140
void LoadActions(PreparedQueryResult result)
Definition Player.cpp:15310
void AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
Definition Player.h:2458
uint32 GetGuildIdInvited()
Definition Player.h:1910
bool HasCorpse() const
Definition Player.h:2045
void SendInitialPacketsBeforeAddToMap()
Definition Player.cpp:11615
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition PlayerQuest.cpp:1818
void setRegenTimerCount(uint32 time)
Definition Player.h:1613
bool HasReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2591
void ResetMap() override
Definition Player.cpp:14700
void ResurectUsingRequestData()
Definition Player.cpp:12865
void RemoveRestState()
Definition Player.cpp:1083
void SendDungeonDifficulty(bool IsInGroup)
Definition PlayerMisc.cpp:167
void AddItemToBuyBackSlot(Item *pItem, uint32 money)
Definition PlayerStorage.cpp:3936
void ResetMonthlyQuestStatus()
Definition Player.cpp:12223
void ResetDailyQuestStatus()
Definition Player.cpp:12191
void Initialize(ObjectGuid::LowType guid)
Definition PlayerStorage.cpp:4780
bool CheckInstanceCount(uint32 instanceId) const
Definition PlayerStorage.cpp:6981
void UpdateTriggerVisibility()
Definition PlayerUpdates.cpp:1738
std::vector< Unit * > m_newVisible
Definition Player.h:2390
void SetReputation(uint32 factionentry, float value)
Definition Player.cpp:15370
void ResyncRunes(uint8 count)
Definition Player.cpp:13467
bool UpdateStats(Stats stat) override
Definition StatSystem.cpp:97
void KilledMonster(CreatureTemplate const *cInfo, ObjectGuid guid)
Definition PlayerQuest.cpp:1915
void SwapItem(uint16 src, uint16 dst)
Definition PlayerStorage.cpp:3536
bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
Definition Player.cpp:10748
void SetRestState(uint32 triggerId)
Definition Player.cpp:1076
bool HasItemTotemCategory(uint32 TotemCategory) const
Definition PlayerStorage.cpp:851
void AddReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2593
uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry)
Definition PlayerQuest.cpp:1751
bool SetDisableGravity(bool disable, bool packetOnly=false, bool updateAnimationTier=true) override
Definition Player.cpp:15939
void RemoveAmmo()
Definition PlayerStorage.cpp:2514
bool Create(ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
Definition Player.cpp:469
uint8 GetRunesState() const
Definition Player.h:2513
void SendDuelCountdown(uint32 counter)
Definition Player.cpp:15385
void SetAtLoginFlag(AtLoginFlags f)
Definition Player.h:2411
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) override
Definition Player.cpp:3830
void SetCanBlock(bool value)
Definition Player.cpp:13174
bool IsDeserter() const
Definition Player.h:2272
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12242
int16 GetSkillTempBonusValue(uint32 skill) const
Definition Player.cpp:5560
void RestoreBaseRune(uint8 index)
Definition Player.cpp:13438
int16 GetSkillPermBonusValue(uint32 skill) const
Definition Player.cpp:5548
void SendRaidInfo()
Definition PlayerStorage.cpp:6520
void DeleteEquipmentSet(uint64 setGuid)
Definition Player.cpp:14659
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12550
bool CanTeleport()
Definition Player.h:2505
void SetBattlegroundId(uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
Definition Player.cpp:12343
void SetServerSideVisibilityDetect(ServerSideVisibilityType type, AccountTypes sec)
Definition Player.cpp:16299
void DestroyConjuredItems(bool update)
Definition PlayerStorage.cpp:3342
bool CanPetResurrect()
Definition Player.cpp:9199
void SetCommandStatusOn(uint32 command)
Definition Player.h:1196
void LearnTalent(uint32 talentId, uint32 talentRank, bool command=false)
Definition Player.cpp:13981
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1979
bool IsNeverVisible() const override
Definition Player.cpp:11478
void AddMail(Mail *mail)
Definition Player.h:1656
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
Definition Player.cpp:12305
void SetTarget(ObjectGuid=ObjectGuid::Empty) override
Definition Player.h:1646
void ResetFarSightDistance()
Definition Player.cpp:16311
bool RemoveMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1688
float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const
Definition Player.cpp:5079
void SetPassOnGroupLoot(bool bPassOnGroupLoot)
Definition Player.h:2496
void SendSellError(SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
Definition PlayerStorage.cpp:4076
static uint32 GetArenaTeamIdFromDB(ObjectGuid guid, uint8 slot)
Definition Player.cpp:6337
void ClearWhisperWhiteList()
Definition Player.h:2566
void RemoveCorpse()
Definition Player.cpp:4694
bool CanAlwaysSee(WorldObject const *obj) const override
Definition Player.cpp:11489
void SwapQuestSlot(uint16 slot1, uint16 slot2)
Definition Player.h:1516
ObjectGuid GetDivider()
Definition Player.h:1558
uint16 GetSkillStep(uint16 skill) const
Definition Player.cpp:5459
std::string const & GetGuildName()
Definition Player.cpp:15380
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12769
void UpdateSpecCount(uint8 count)
Definition PlayerUpdates.cpp:2186
CinematicMgr * GetCinematicMgr() const
Definition Player.h:1390
void UpdateFallInformationIfNeed(MovementInfo const &minfo, uint16 opcode)
Definition PlayerUpdates.cpp:2178
void SendRespondInspectAchievements(Player *player) const
Definition Player.cpp:13951
bool HasHealSpec()
Definition Player.cpp:16168
std::unordered_map< uint32, SeasonalQuestSet > SeasonalEventQuestMap
Definition Player.h:2704
bool CanNoReagentCast(SpellInfo const *spellInfo) const
Definition Player.cpp:12600
void LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
Definition Player.cpp:14114
uint32 m_AreaID
Definition Player.h:2671
uint32 DurabilityRepairAll(bool cost, float discountMod, bool guildBank)
Definition Player.cpp:4844
std::set< uint32 > QuestSet
Definition Player.h:2702
void SetBGData(BGData &bgdata)
Definition Player.h:2268
bool HasWeaponForAttack(WeaponAttackType type) const override
Definition Player.h:1269
bool HasQuest(uint32 questId) const
Definition PlayerQuest.cpp:101
void SendResetFailedNotify(uint32 mapid)
Definition PlayerMisc.cpp:187
uint32 GetSpellByProto(ItemTemplate *proto)
void SendAttackSwingCantAttack()
Definition PlayerMisc.cpp:134
void RestoreManaAfterDuel()
Definition Player.h:2172
void RemoveFromWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2569
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3544
PartyResult CanUninviteFromGroup(ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
Definition Player.cpp:13050
void MoveItemToInventory(ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
Definition PlayerStorage.cpp:2998
ActionButton const * GetActionButton(uint8 button)
Definition Player.cpp:5672
bool CanJoinToBattleground() const
Definition Player.cpp:11396
void RestoreHealthAfterDuel()
Definition Player.h:2171
bool IsAtLootRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12823
void RestoreAllSpellMods(uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:10039
void SendQuestUpdateAddItem(Quest const *quest, uint32 item_idx, uint16 count)
Definition PlayerQuest.cpp:2447
uint32 GetWeaponProficiency() const
Definition Player.h:1371
void RemoveReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2594
void SetBonusTalentCount(uint32 count)
Definition Player.h:1741
Item * GetShield(bool useable=false) const
Definition PlayerStorage.cpp:523
~Player() override
Definition Player.cpp:412
SpellCooldowns const & GetSpellCooldownMap() const
Definition Player.h:1783
bool HasFreeBattlegroundQueueId() const
Definition Player.cpp:12296
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14339
void SetInGuild(uint32 GuildId)
Definition Player.h:1899
void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const *aura)
Definition Player.h:2527
void SetCommentator(bool on)
Definition Player.h:1170
void ClearChannelWatch()
Definition Player.cpp:5033
void ProcessDelayedOperations()
Definition Player.cpp:1618
float GetAverageItemLevel()
Definition Player.cpp:15759
bool HasSpellItemCooldown(uint32 spell_id, uint32 itemid) const override
Definition Player.cpp:16375
ObjectGuid getRuneWeaponGUID()
Definition Player.h:2601
float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const
Definition Player.cpp:5224
void UpdateResistances(uint32 school) override
Definition StatSystem.cpp:225
void SetCommandStatusOff(uint32 command)
Definition Player.h:1197
void setRuneWeaponGUID(ObjectGuid guid)
Definition Player.h:2600
bool IsActiveQuest(uint32 quest_id) const
Definition PlayerQuest.cpp:202
void ClearReceivedSpectatorResetFor()
Definition Player.h:2592
void ResetWeeklyQuestStatus()
Definition Player.cpp:12203
float GetRealParry() const
Definition Player.h:2615
uint32 GetNextSave() const
Definition Player.h:2619
void SetChampioningFaction(uint32 faction)
Definition Player.h:2559
bool hasSpanishClient()
Definition Player.h:1102
void SendMovieStart(uint32 MovieId)
Definition Player.cpp:5742
LootItem * StoreLootItem(uint8 lootSlot, Loot *loot, InventoryResult &msg)
Definition Player.cpp:13556
void LoadCorpse(PreparedQueryResult result)
Definition PlayerStorage.cpp:5815
uint32 AddBattlegroundQueueId(BattlegroundQueueTypeId val)
Definition Player.cpp:12281
void SendCinematicStart(uint32 CinematicSequenceId) const
Definition Player.cpp:5731
void LoadPet()
Definition PlayerStorage.cpp:6216
bool isResurrectRequested() const
Definition Player.h:1835
Optional< float > GetFarSightDistance() const
Definition Player.cpp:16316
void SetEquipmentSet(uint32 index, EquipmentSet eqset)
Definition Player.cpp:14543
void UpdateMirrorTimers()
Definition PlayerUpdates.cpp:429
void ModifySkillBonus(uint32 skillid, int32 val, bool talent)
Definition Player.cpp:5330
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2176
TrainerSpellState GetTrainerSpellState(TrainerSpell const *trainer_spell) const
Definition Player.cpp:3910
uint32 GetLastPetNumber() const
Definition Player.h:2465
uint8 getCinematic() const
Definition Player.h:1838
uint32 GetBonusTalentCount()
Definition Player.h:1742
void DurabilityPointsLossAll(int32 points, bool inventory)
Definition Player.cpp:4782
bool IsVisibleGloballyFor(Player const *player) const
Definition Player.cpp:11523
uint32 GetLevelPlayedTime()
Definition Player.h:1204
void SetPendingSpectatorInviteInstanceId(uint32 bgInstanceId)
Definition Player.h:2589
bool IsBeingTeleportedNear() const
Definition Player.h:2099
Seconds GetCreationTime() const
Definition Player.h:2547
void SaveManaBeforeDuel()
Definition Player.h:2170
time_t GetSummonExpireTimer() const
Definition Player.h:1118
void SetRank(uint8 rankId)
Definition Player.h:1905
Pet * CreatePet(Creature *creatureTarget, uint32 spellID=0)
Definition Player.cpp:9238
void ToggleAFK()
Definition Player.cpp:1293
Pet * SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0s, uint32 healthPct=0)
Definition Player.cpp:8967
void OnGossipSelect(WorldObject *source, uint32 gossipListId, uint32 menuId)
Definition PlayerGossip.cpp:244
void PossessSpellInitialize()
Definition Player.cpp:9577
bool LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
Definition PlayerStorage.cpp:4918
AchievementMgr * GetAchievementMgr() const
Definition Player.h:2544
std::vector< Item * > & GetItemUpdateQueue()
Definition Player.h:1272
SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
Definition Player.cpp:7018
bool TakeQuestSourceItem(uint32 questId, bool msg)
Definition PlayerQuest.cpp:1363
Item * GetMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1675
void SetSheath(SheathState sheathed) override
Definition PlayerStorage.cpp:97
Item * GetItemFromBuyBackSlot(uint32 slot)
Definition PlayerStorage.cpp:3987
void CalcRage(uint32 damage, bool attacker)
bool HasCasterSpec()
Definition Player.cpp:16145
void UpdateLFGChannel()
Definition PlayerUpdates.cpp:464
static bool LoadPositionFromDB(uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
Definition PlayerStorage.cpp:4875
static bool BuildEnumData(PreparedQueryResult result, WorldPacket *data)
Definition Player.cpp:1090
SkillStatusMap const & GetSkillStatusMap() const
Definition Player.h:1786
bool IsDailyQuestDone(uint32 quest_id)
Definition Player.cpp:12153
void UpdateSpeakTime(ChatFloodThrottle::Index index)
Definition PlayerMisc.cpp:29
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
Definition PlayerStorage.cpp:6706
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition Player.cpp:11502
void AddArmorProficiency(uint32 newflag)
Definition Player.h:1370
void KillCreditGO(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition PlayerQuest.cpp:2056
bool IsFalling() const
Definition Player.cpp:2180
std::list< Channel * > JoinedChannelsList
Definition Player.h:2856
void ResetAllPowers()
Definition Player.cpp:2060
Quest const * GetNextQuest(ObjectGuid guid, Quest const *quest)
Definition PlayerQuest.cpp:207
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12895
uint32 GetGroupUpdateFlag() const
Definition Player.h:2481
void SetHomebind(WorldLocation const &loc, uint32 areaId)
Definition PlayerStorage.cpp:4896
uint32 GetArenaTeamIdInvited()
Definition Player.h:1925
void SetSaveTimer(uint32 timer)
Definition Player.h:2364
bool CanShareQuest(uint32 quest_id) const
Definition PlayerQuest.cpp:1458
Player * GetSelectedPlayer() const
Definition Player.cpp:11584
void ModifySpellCooldown(uint32 spellId, int32 cooldown)
Definition Player.cpp:11130
void AddWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2567
bool GetPassOnGroupLoot() const
Definition Player.h:2497
Unit * GetSelectedUnit() const
Definition Player.cpp:11576
Player * GetNextRandomRaidMember(float radius)
Definition Player.cpp:13024
void AddToWorld() override
Definition Player.cpp:1702
void RemoveAllSpellCooldown()
Definition Player.cpp:3587
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition Player.cpp:13966
void SetIsSpectator(bool on)
Definition Player.cpp:15392
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12706
uint32 GetPhaseMaskForSpawn() const
Definition Player.cpp:13810
bool CanRequestSpellCast(SpellInfo const *spellInfo)
Definition PlayerUpdates.cpp:2329
float GetRealDodge() const
Definition Player.h:2616
void SetShowDKPet(bool on)
Definition Player.h:2605
void SetDivider(ObjectGuid guid=ObjectGuid::Empty)
Definition Player.h:1559
bool IsCurrentBattlegroundRandom() const
Definition Player.h:2266
uint8 GetMostPointsTalentTree() const
Definition Player.cpp:15339
static void ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
Reset all solo instances and optionally send a message on success for each.
Definition PlayerMisc.cpp:195
void UninviteFromGroup()
Definition Player.cpp:2340
void KilledPlayerCredit(uint16 count=1)
Definition PlayerQuest.cpp:1995
void VehicleSpellInitialize()
Definition Player.cpp:9605
bool SetFeatherFall(bool apply, bool packetOnly=false) override
Definition Player.cpp:16020
void AbandonQuest(uint32 quest_id)
Definition PlayerQuest.cpp:930
void RemoveRewardedQuest(uint32 questId, bool update=true)
Definition PlayerQuest.cpp:1513
void Yell(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles yelled message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9395
void CastItemUseSpell(Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
Definition Player.cpp:7413
std::string GetDebugInfo() const override
Definition Player.cpp:16387
void SetTaxiCheater(bool on)
Definition Player.h:1180
void TextEmote(std::string_view text, WorldObject const *=nullptr, bool=false) override
Outputs an universal text which is supposed to be an action.
Definition Player.cpp:9416
void ReportedAfkBy(Player *reporter)
This player has been blamed to be inactive in a battleground.
Definition Player.cpp:11415
time_t GetSemaphoreTeleportNear() const
Definition Player.h:2103
void RefundItem(Item *item)
Definition Player.cpp:15627
void SetArenaTeamIdInvited(uint32 ArenaTeamId)
Definition Player.h:1924
void Whisper(std::string_view text, Language language, Player *receiver, bool=false) override
Handles whispers from Addons and players based on sender, receiver's guid and language.
Definition Player.cpp:9438
void AddSpellMod(SpellModifier *mod, bool apply)
Definition Player.cpp:9924
void ToggleDND()
Definition Player.cpp:1302
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14270
void AddRunePower(uint8 index)
Definition Player.cpp:13479
RuneType GetLastUsedRune()
Definition Player.h:2520
void RemovedInsignia(Player *looterPlr)
Definition Player.cpp:7770
void RemoveFromWorld() override
Definition Player.cpp:1714
void JoinedChannel(Channel *c)
Definition Player.cpp:5013
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14316
bool CanEnterWater() const override
Definition Player.h:2578
WorldLocation GetStartPosition() const
Definition Player.cpp:11440
void AddWeaponProficiency(uint32 newflag)
Definition Player.h:1369
void RemoveBonusTalent(uint32 count)
Definition Player.h:1744
static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
Definition PlayerMisc.cpp:84
bool IsSummonAsSpectator() const
Definition Player.cpp:16364
void SetPendingSpectatorForBG(uint32 bgInstanceId)
Definition Player.h:2587
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1876
bool IsOutdoorPvPActive()
Definition Player.cpp:6439
void SetInGameTime(uint32 time)
Definition Player.h:1563
bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true) override
Definition Player.cpp:15978
uint32 GetPendingSpectatorInviteInstanceId() const
Definition Player.h:2590
bool CanInteractWithQuestGiver(Object *questGiver)
Definition Player.cpp:2081
uint32 GetQuestSlotTime(uint16 slot) const
Definition Player.h:1497
Mail * GetMail(uint32 id)
Definition Player.cpp:3818
BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const
Definition Player.cpp:12253
void SetBankBagSlotCount(uint8 count)
Definition Player.h:1283
uint8 GetGrantableLevels()
Definition Player.h:2130
uint32 GetDelayedOperations() const
Definition Player.h:2106
void setCinematic(uint8 cine)
Definition Player.h:1842
bool CheckInstanceLoginValid()
Definition PlayerStorage.cpp:6952
void SetLastPetNumber(uint32 petnumber)
Definition Player.h:2466
bool isTaxiCheater() const
Definition Player.h:1179
uint32 GetQuestSlotState(uint16 slot) const
Definition Player.h:1495
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition Player.cpp:13124
InventoryResult CanStoreItems(Item **pItem, int32 count) const
Definition PlayerStorage.cpp:1539
void SetSession(WorldSession *sess)
Definition Player.h:2006
void RemoveArenaEnchantments(EnchantmentSlot slot)
Definition PlayerStorage.cpp:4225
void resetSpells()
Definition Player.cpp:11856
bool CanCaptureTowerPoint() const
Definition Player.cpp:13281
void SetInviteForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
Definition Player.cpp:12318
GuidSet RefundableItemsSet
Definition Player.h:2943
void SendNotifyLootMoneyRemoved()
Definition Player.cpp:8209
bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
Definition Player.cpp:12355
void SetRandomWinner(bool isWinner)
Definition Player.cpp:15742
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject *pRewardSource)
Definition Player.cpp:12774
QuestStatusSaveMap & GetQuestStatusSaveMap()
Definition Player.h:1635
void ResetAchievements()
Definition Player.cpp:13946
bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
Definition PlayerUpdates.cpp:759
time_t GetSemaphoreTeleportFar() const
Definition Player.h:2104
Definition QueryHolder.h:44
Definition UnitUtils.h:47
Definition Spell.h:111
Seconds const StartTime
Definition GameTime.cpp:25
Items
Definition oculus.h:74
Definition Player.h:394
Definition Player.h:1037
Definition DBCStructure.h:589
uint32 bit_index
Definition DBCStructure.h:638
Definition WorldSession.h:299
Definition Player.h:382
Definition Player.h:947
Definition Player.h:1054
Definition Object.h:281
Definition Player.h:301
Definition Player.h:320
Definition Player.h:284
Definition Player.h:332
BattlegroundQueueTypeId bgQueueTypeId
Definition Player.h:2683
uint32 invitedToInstance
Definition Player.h:2684
uint32 Count
Definition Player.h:2331
time_t Time
Definition Player.h:2330
Index
Definition Player.h:2324
@ MAX
Definition Player.h:2327
Definition Player.h:362
Definition Player.h:422
Definition Player.h:779
Definition CreatureData.h:507

Referenced by SendInitWorldStates().

◆ duel

◆ healthBeforeDuel

uint32 Player::healthBeforeDuel
private

◆ isDebugAreaTriggers

◆ ItemSetEff

std::vector<ItemSetEffect*> Player::ItemSetEff

◆ m_achievementMgr

◆ m_actionButtons

◆ m_activeSpec

◆ m_additionalSaveMask

uint8 Player::m_additionalSaveMask
protected

◆ m_additionalSaveTimer

uint16 Player::m_additionalSaveTimer
protected

◆ m_ammoDPS

float Player::m_ammoDPS
protected

◆ m_AreaID

uint32 Player::m_AreaID
protected

◆ m_areaUpdateId

uint32 Player::m_areaUpdateId
protected

◆ m_ArenaTeamIdInvited

uint32 Player::m_ArenaTeamIdInvited
protected

◆ m_ArmorProficiency

uint32 Player::m_ArmorProficiency
protected

◆ m_atLoginFlags

uint32 Player::m_atLoginFlags
protected

◆ m_auraBaseMod

◆ m_auraRaidUpdateMask

◆ m_baseFeralAP

uint32 Player::m_baseFeralAP
protected

◆ m_baseHealthRegen

uint32 Player::m_baseHealthRegen
protected

◆ m_baseManaRegen

uint32 Player::m_baseManaRegen
protected

◆ m_baseRatingValue

int32 Player::m_baseRatingValue[MAX_COMBAT_RATING]
protected

◆ m_baseSpellPower

uint32 Player::m_baseSpellPower
protected

◆ m_bgData

◆ m_bHasDelayedTeleport

bool Player::m_bHasDelayedTeleport
private

◆ m_bMustDelayTeleport

bool Player::m_bMustDelayTeleport
private

◆ m_bPassOnGroupLoot

bool Player::m_bPassOnGroupLoot
protected

◆ m_canBlock

bool Player::m_canBlock
protected

Referenced by CanBlock(), Player(), and SetCanBlock().

◆ m_canKnockback

bool Player::m_canKnockback
private

◆ m_canParry

bool Player::m_canParry
protected

Referenced by CanParry(), Player(), and SetCanParry().

◆ m_canTeleport

bool Player::m_canTeleport
private

Referenced by CanTeleport(), Player(), and SetCanTeleport().

◆ m_canTitanGrip

bool Player::m_canTitanGrip
protected

◆ m_ChampioningFaction

uint32 Player::m_ChampioningFaction
private

◆ m_channels

◆ m_charmAISpells

uint32 Player::m_charmAISpells[NUM_CAI_SPELLS]
protected

◆ m_charmUpdateTimer

uint32 Player::m_charmUpdateTimer

Referenced by Player(), and Update().

◆ m_charSettingsMap

◆ m_chatFloodData

std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> Player::m_chatFloodData
protected

Referenced by UpdateSpeakTime().

◆ m_cinematic

uint8 Player::m_cinematic
protected

◆ m_clientGUIDs

◆ m_contestedPvPTimer

uint32 Player::m_contestedPvPTimer
protected

◆ m_creationTime

Seconds Player::m_creationTime
private

◆ m_currentBuybackSlot

uint32 Player::m_currentBuybackSlot
protected

◆ m_DailyQuestChanged

bool Player::m_DailyQuestChanged
protected

◆ m_deathExpireTime

◆ m_deathTimer

◆ m_declinedname

DeclinedName* Player::m_declinedname
protected

◆ m_DelayedOperations

uint32 Player::m_DelayedOperations
private

◆ m_DFQuests

◆ m_divider

ObjectGuid Player::m_divider
protected

Referenced by GetDivider(), and SetDivider().

◆ m_drunkTimer

uint32 Player::m_drunkTimer
protected

◆ m_drwGUID

ObjectGuid Player::m_drwGUID

◆ m_dungeonDifficulty

Difficulty Player::m_dungeonDifficulty
protected

◆ m_enchantDuration

◆ m_entryPointData

◆ m_EquipmentSets

◆ m_extraBonusTalentCount

◆ m_ExtraFlags

◆ m_flightSpellActivated

uint32 Player::m_flightSpellActivated
private

◆ m_foodEmoteTimerCount

uint32 Player::m_foodEmoteTimerCount
protected

Referenced by Player(), and RegenerateAll().

◆ m_forced_speed_changes

uint8 Player::m_forced_speed_changes[MAX_MOVE_TYPE]

◆ m_GlobalCooldownMgr

GlobalCooldownMgr Player::m_GlobalCooldownMgr
protected

Referenced by GetGlobalCooldownMgr().

◆ m_Glyphs

◆ m_grantableLevels

uint8 Player::m_grantableLevels
protected

◆ m_group

◆ m_groupInvite

Group* Player::m_groupInvite
protected

Referenced by GetGroupInvite(), and SetGroupInvite().

◆ m_groupUpdateMask

uint32 Player::m_groupUpdateMask
protected

◆ m_GuildIdInvited

uint32 Player::m_GuildIdInvited
protected

◆ m_homebindAreaId

uint16 Player::m_homebindAreaId

◆ m_homebindMapId

◆ m_HomebindTimer

uint32 Player::m_HomebindTimer

Referenced by Player(), and UpdateHomebindTime().

◆ m_homebindX

◆ m_homebindY

◆ m_homebindZ

◆ m_hostileReferenceCheckTimer

uint16 Player::m_hostileReferenceCheckTimer
protected

Referenced by Player(), and Update().

◆ m_ingametime

uint32 Player::m_ingametime
protected

◆ m_InstanceValid

◆ m_IsBGRandomWinner

bool Player::m_IsBGRandomWinner
protected

◆ m_isInSharedVisionOf

std::set<Unit*> Player::m_isInSharedVisionOf

◆ m_isInstantFlightOn

bool Player::m_isInstantFlightOn
private

◆ m_isInWater

bool Player::m_isInWater
private

Referenced by IsInWater(), Player(), and SetInWater().

◆ m_itemDuration

◆ m_items

◆ m_itemSoulboundTradeable

ItemDurationList Player::m_itemSoulboundTradeable
protected

◆ m_itemUpdateQueue

std::vector<Item*> Player::m_itemUpdateQueue
protected

◆ m_itemUpdateQueueBlocked

bool Player::m_itemUpdateQueueBlocked
protected

◆ m_Last_tick

time_t Player::m_Last_tick

Referenced by Create(), Player(), and Update().

◆ m_lastDailyQuestTime

time_t Player::m_lastDailyQuestTime
protected

◆ m_lastFallTime

uint32 Player::m_lastFallTime
private

◆ m_lastFallZ

float Player::m_lastFallZ
private

◆ m_lastHonorUpdateTime

time_t Player::m_lastHonorUpdateTime
protected

◆ m_lastpetnumber

uint32 Player::m_lastpetnumber
protected

◆ m_lastPotionId

uint32 Player::m_lastPotionId
protected

◆ m_logintime

time_t Player::m_logintime

Referenced by AddItemToBuyBackSlot(), and Player().

◆ m_lootGuid

ObjectGuid Player::m_lootGuid
protected

Referenced by GetLootGUID(), and SetLootGUID().

◆ m_mail

◆ m_mailsUpdated

◆ m_mapRef

MapReference Player::m_mapRef
private

Referenced by GetMapRef(), and SetMap().

◆ m_MirrorTimer

int32 Player::m_MirrorTimer[MAX_TIMERS]
private

◆ m_MirrorTimerFlags

uint8 Player::m_MirrorTimerFlags
private

◆ m_MirrorTimerFlagsLast

uint8 Player::m_MirrorTimerFlagsLast
private

◆ m_MonthlyQuestChanged

bool Player::m_MonthlyQuestChanged
protected

◆ m_monthlyquests

◆ m_MountBlockId

uint32 Player::m_MountBlockId
protected

◆ m_mover

◆ m_NeedToSaveGlyphs

bool Player::m_NeedToSaveGlyphs
protected

◆ m_needZoneUpdate

bool Player::m_needZoneUpdate
protected

◆ m_newVisible

std::vector<Unit*> Player::m_newVisible

◆ m_nextMailDelivereTime

time_t Player::m_nextMailDelivereTime

◆ m_nextSave

uint32 Player::m_nextSave
protected

◆ m_oldpetspell

uint32 Player::m_oldpetspell
private

◆ m_originalGroup

GroupReference Player::m_originalGroup
protected

◆ m_pendingSpectatorForBG

uint32 Player::m_pendingSpectatorForBG

◆ m_pendingSpectatorInviteInstanceId

uint32 Player::m_pendingSpectatorInviteInstanceId

◆ m_petStable

std::unique_ptr<PetStable> Player::m_petStable
private

◆ m_Played_time

◆ m_powerFraction

float Player::m_powerFraction[MAX_POWERS]
protected

Referenced by Player(), and Regenerate().

◆ m_questRewardTalentCount

uint32 Player::m_questRewardTalentCount
protected

◆ m_QuestStatus

◆ m_QuestStatusSave

◆ m_raidDifficulty

Difficulty Player::m_raidDifficulty
protected

◆ m_raidMapDifficulty

Difficulty Player::m_raidMapDifficulty
protected

◆ m_realDodge

float Player::m_realDodge
protected

◆ m_realParry

float Player::m_realParry
protected

◆ m_recallMap

uint32 Player::m_recallMap

Referenced by Player(), and SaveRecallPosition().

◆ m_recallO

float Player::m_recallO

Referenced by Player(), and SaveRecallPosition().

◆ m_recallX

float Player::m_recallX

Referenced by Player(), and SaveRecallPosition().

◆ m_recallY

float Player::m_recallY

Referenced by Player(), and SaveRecallPosition().

◆ m_recallZ

float Player::m_recallZ

Referenced by Player(), and SaveRecallPosition().

◆ m_receivedSpectatorResetFor

◆ m_refundableItems

RefundableItemsSet Player::m_refundableItems
private

◆ m_regenTimerCount

uint32 Player::m_regenTimerCount
protected

◆ m_reputationMgr

◆ m_resetTalentsCost

uint32 Player::m_resetTalentsCost
protected

◆ m_resetTalentsTime

time_t Player::m_resetTalentsTime
protected

◆ m_resurrectGUID

ObjectGuid Player::m_resurrectGUID
protected

◆ m_resurrectHealth

uint32 Player::m_resurrectHealth
protected

◆ m_resurrectMana

uint32 Player::m_resurrectMana
protected

◆ m_resurrectMap

uint32 Player::m_resurrectMap
protected

◆ m_resurrectX

float Player::m_resurrectX
protected

◆ m_resurrectY

float Player::m_resurrectY
protected

◆ m_resurrectZ

float Player::m_resurrectZ
protected

◆ m_RewardedQuests

◆ m_RewardedQuestsSave

QuestStatusSaveMap Player::m_RewardedQuestsSave
protected

◆ m_runes

◆ m_SeasonalQuestChanged

bool Player::m_SeasonalQuestChanged
protected

◆ m_seasonalquests

◆ m_seer

◆ m_session

◆ m_social

PlayerSocial* Player::m_social
protected

Referenced by GetSocial(), LoadFromDB(), and Player().

◆ m_soulboundTradableLock

std::mutex Player::m_soulboundTradableLock
protected

◆ m_specsCount

◆ m_spellCooldowns

◆ m_spellMods

◆ m_spellModTakingSpell

◆ m_spellPenetrationItemMod

int32 Player::m_spellPenetrationItemMod
protected

◆ m_spells

◆ m_summon_asSpectator

bool Player::m_summon_asSpectator
protected

◆ m_summon_expire

time_t Player::m_summon_expire
protected

◆ m_summon_mapid

uint32 Player::m_summon_mapid
protected

◆ m_summon_x

float Player::m_summon_x
protected

◆ m_summon_y

float Player::m_summon_y
protected

◆ m_summon_z

float Player::m_summon_z
protected

◆ m_swingErrorMsg

uint8 Player::m_swingErrorMsg
protected

Referenced by Player(), and Update().

◆ m_talents

◆ m_taxi

◆ m_team

TeamId Player::m_team
protected

◆ m_temporaryUnsummonedPetNumber

◆ m_timedquests

QuestSet Player::m_timedquests
protected

◆ m_trade

◆ m_usedTalentCount

uint32 Player::m_usedTalentCount
protected

◆ m_weaponChangeTimer

uint32 Player::m_weaponChangeTimer
protected

◆ m_WeaponProficiency

uint32 Player::m_WeaponProficiency
protected

◆ m_WeeklyQuestChanged

bool Player::m_WeeklyQuestChanged
protected

◆ m_weeklyquests

◆ m_zoneUpdateId

uint32 Player::m_zoneUpdateId
protected

◆ m_zoneUpdateTimer

uint32 Player::m_zoneUpdateTimer
protected

Referenced by Player(), Update(), and UpdateZone().

◆ manaBeforeDuel

uint32 Player::manaBeforeDuel
private

◆ mMitems

ItemMap Player::mMitems

◆ mSemaphoreTeleport_Far

time_t Player::mSemaphoreTeleport_Far
private

◆ mSemaphoreTeleport_Near

time_t Player::mSemaphoreTeleport_Near
private

◆ mSkillStatus

◆ PlayerTalkClass

PlayerMenu* Player::PlayerTalkClass

Referenced by AddGossipItemFor(), AddGossipItemFor(), AddGossipItemFor(), ClearGossipMenuFor(), CloseGossipMenuFor(), Spell::EffectQuestStart(), go_wind_stone::go_wind_stoneAI::GossipSelect(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverCancel(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), WorldSession::HandleQuestQueryOpcode(), npc_wg_quest_giver::OnGossipHello(), npc_elder_clearwater::OnGossipHello(), npc_experience::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_cos_chromie_middle::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), OnGossipSelect(), Player(), PrepareGossipMenu(), PrepareQuestMenu(), WorldSession::SendBindPoint(), SendGossipMenuFor(), SendPreparedGossip(), SendPreparedQuest(), npc_costumed_orphan_matron::sGossipHello(), npc_pet_trainer::npc_pet_trainerAI::sGossipSelect(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_echo_of_medivh::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_sergeant_bly::npc_sergeant_blyAI::sGossipSelect(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), and ~Player().

◆ pvpInfo

◆ SpellQueue

◆ teleportStore_dest

WorldLocation Player::teleportStore_dest
private

Referenced by GetTeleportDest(), TeleportTo(), and Update().

◆ teleportStore_options

uint32 Player::teleportStore_options
private

Referenced by Player(), TeleportTo(), and Update().

◆ unReadMails

◆ WhisperList


The documentation for this class was generated from the following files: